2013-05-24 2 views
0

Я создаю сайт в стиле форума в Django и сталкиваюсь с некоторыми проблемами в моей структуре дизайна. Соответствующий код (от моей модели) выглядит следующим образом:Реализация подмножеств внешних ключей в Django

class Thread(models.Model): 
    post_count = models.IntegerField() 

class Post(models.Model): 
    text = models.CharField(max_length=1000) 
    thread = models.ForeignKey(Thread) 

вопрос, который я имею, что на мой взгляд, и шаблон, я перебирать тем и сообщений на дисплее. Тем не менее, у меня есть желание связать мой шаблон с тем, что сообщение может иметь определенные «специальные свойства» (например, создатель потока, последние сообщения, сообщения с наивысшей оценкой и т. Д.). Мне кажется разумным, что это будут свойства потока, а не сама почта (поскольку каждый поток будет иметь эти, но только переменное/пренебрежимое количество сообщений), но решения этой проблемы, которые мне удалось создать участвовали в двойном соединении сообщений с потоком (через другой ForeignKey (Thread) в определении Post) или путем размещения BooleanFields в определении Post, чтобы указать статус в этих списках. Я даже не уверен, что они будут работать или быть видимыми в шаблоне Django.

Мой вопрос: существует ли в Django чистый способ специализировать или группировать экземпляры модели, которые уже связаны с помощью сестра-элементов во внешнем ключе, то есть подмножать ForeignKey в отдельные (и, возможно, перекрывающиеся) группы? Или я подхожу к этой проблеме в непитоническом/неанджанго? Любое понимание или ссылки на документацию, которую я, возможно, упустил, будут оценены.

ответ

0

Вы можете добавить некоторые свойства, как ManyToManyField в тему

class Thread(models.Model): 
    post_count = models.IntegerField() 
    post_latest = models.ManyToManyField(Post, related_name='as_latest', null=True, blank=True) 

Или я предпочитаю использовать @property, чтобы получить данные, необходимые с определенными свойствами:

class Thread(models.Model): 
    post_count = models.IntegerField() 

    @property 
    def post_latest(self): 
     return self.post_set.order_by('-id')[:10] 
Смежные вопросы