Джанго: общие отношения один-ко-многим с Contenttypes - PullRequest
3 голосов
/ 06 декабря 2009

Я пытаюсь сделать следующее соответствие в Django ORM. Наличие модели Publish, которая управляет публикацией различных типов контента (другие модели). Это так, что я могу легко сделать Publish.objects.all() и заказать их по дате. Я сделал общую модель следующим образом:

class Publish(models.Model):
    """ Intermediary model for displaying and managing different types of content """
    status = models.IntegerField(_('status'), choices=STATUS_CHOICES, default=1)
    publish = models.DateTimeField(_('publish'), default=datetime.datetime.now)

    content_type = models.ForeignKey(ContentType)
    object_id = models.PositiveIntegerField()
    content_object = generic.GenericForeignKey('content_type', 'object_id')

Проблема в том, что я хочу прикрепить это к разным моделям. Это должны быть отношения OneToMany. Потому что статья может иметь только одну дату публикации. Родовые отношения, насколько я знаю, это отношения ManyToMany.

Я пытался ограничить max_num и extra в GenericTabularInline в admin.py, но это не очень хорошее рабочее решение. Кто-нибудь знает, как прикрепить модель публикации к нескольким различным моделям, сделав ее обязательным отношением «один ко многим»? Многие из них являются моделью публикации, одна для бывших. статья.

Ответы [ 3 ]

8 голосов
/ 06 декабря 2009

Ваше предположение неверно - общие внешние ключи - один ко многим, а не многие ко многим. Вы можете видеть, что ваша модель имеет поля content_object и object_id - т.е. этот экземпляр публикации ссылается на один целевой объект, хотя этот объект может иметь много экземпляров публикации.

Похоже, что вы действительно хотите, это модель OneToOne. Вы можете эмулировать это с имеющейся у вас моделью, вы можете просто ограничить создание объектов публикации, так что для каждого целевого объекта может быть только один. Вы можете сделать это, установив unique_together на content_type и object_id в подклассе Meta.

class Publish(models.Model):
    ... fields ...

    class Meta:
        unique_together('content_type', 'object_id')

Другой вариант, который вы могли бы рассмотреть, - вместо использования общих отношений попробуйте наследование модели с несколькими таблицами, где каждый объект наследуется от Publish.

0 голосов
/ 06 декабря 2009

Это не совсем ясно в вашем вопросе (другие, похоже, пришли к другому выводу), но мне кажется, что вы не запрашиваете OneToOne, вы запрашиваете OneToMany в противоположном направлении (где экземпляр публикации может есть несколько статей, но не наоборот). В этом случае вы вообще откажетесь от GenericForeignKey и просто убедитесь, что все ваши модели контента имеют обычный ForeignKey для публикации. Вы можете использовать наследование абстрактной модели, чтобы немного подсушить, если хотите.

0 голосов
/ 06 декабря 2009

Я бы написал OneToOneGenericForeignKey, я не знаю ни о чем.

Или, если Статья (или любой другой объект) может быть опубликована только один раз, они могут иметь ссылку на модель публикации.

Однако я бы не стал этого делать, так как для меня имеет смысл публиковать вещи несколько раз (категории, сайты), поэтому я просто наложил бы ограничения через max_num / field / save / manager / что угодно и оставил бы мои опции открытыми на будущее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...