Как сохранить произвольные пары ключей имени/значения в модели Django?

Raymond Chen ответил на это некоторое время назад
( https://devblogs.microsoft.com/oldnewthing/20071008-00/? p=24863):

Это на самом деле довольно просто, хотя едва что-либо Вы были бы в состоянии предположить самостоятельно.Примечание: Детали этого алгоритма являются деталью реализации. Это может измениться в любое время, не полагайтесь на него. На самом деле это уже изменилось с Зеркальным отражением и Flip3D; я просто говорю об окне Classic Alt+Tab здесь.

Для каждого видимого окна, идите по его цепочке владельца, пока Вы не найдете корневого владельца. Тогда обход отодвигает видимую последнюю активную всплывающую цепочку, пока Вы не находите видимое окно. Если Вы вернулись туда, где Вы запускаетесь, то помещенный окно в списке Alt+Tab. В псевдокоде:

BOOL IsAltTabWindow(HWND hwnd)
{
 // Start at the root owner
 HWND hwndWalk = GetAncestor(hwnd, GA_ROOTOWNER);

 // See if we are the last active visible popup
 HWND hwndTry;
 while ((hwndTry = GetLastActivePopup(hwndWalk)) != hwndTry) {
  if (IsWindowVisible(hwndTry)) break;
  hwndWalk = hwndTry;
 }
 return hwndWalk == hwnd;
}

Переходят по ссылке к записи в блоге Chen для получения дополнительной информации и некоторых угловых условий.

9
задан MikeN 29 October 2009 в 00:37
поделиться

5 ответов

Рассмотрите возможность представления всех настраиваемых свойств с помощью сериализованного dict. Я использовал это в недавнем проекте, и он сработал очень хорошо.

 class Widget(models.Model):
      owner = models.ForeignKey(auth.User)
      props = models.TextField(blank=True) # serialized custom data

      @property
      def props_dict(self):
          return simplejson.loads(self.props)

 class UserProfile(models.Model)
      user = models.ForeignKey(auth.User)
      widget_fields = models.TextField(blank=True) # serialized schema declaration
22
ответ дан 4 December 2019 в 06:57
поделиться

Похоже, вы заново изобрели тройной магазин. Я думаю, что это обычное дело, поскольку мы доводим идею гибкости базы данных до ее естественного вывода. Тройные хранилища, как правило, довольно неэффективны в системах реляционных баз данных, но есть системы, разработанные специально для них.

http://en.wikipedia.org/wiki/Triplestore

В масштабах, о которых вы говорите, ваши производительность, вероятно, будет приемлемой, но они, как правило, плохо масштабируются без специализированной БД.

8
ответ дан 4 December 2019 в 06:57
поделиться

На мой взгляд, лучший способ создать такую ​​полностью расширяемую модель - это использовать EAV (сущность, атрибут, значение). По сути, это способ перенести в SQL нереляционную базу данных без схемы. Вы можете прочитать об этом больше в википедии, http://en.wikipedia.org/wiki/Entity-attribute-value_model , но одна из лучших его реализаций в django взята из кодовой базы EveryBlock. Надеюсь, это поможет!

http://github.com/brosner/everyblock_code/blob/master/ebpub/ebpub/db/models.py

2
ответ дан 4 December 2019 в 06:57
поделиться

When I had an object that could be completely customized by users, I created a field on the model that would contain some JSON in the column. Then you can just serialize back and forth when you need to use it or save it.

However, it does make it harder to use the data in SQL queries.

0
ответ дан 4 December 2019 в 06:57
поделиться

http://github.com/tuttle/django-expando могут быть вам интересны.

1
ответ дан 4 December 2019 в 06:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: