Правильные отношения с моделями Django - PullRequest
2 голосов
/ 16 июля 2011

Предисловие: у меня есть две модели (Product и UserProfile), и я хотел бы реализовать систему комментариев к шахте.Комментарий относится к объекту, Product или UserProfile.

class Product(models.Model):
    name = models.CharField(max_length = 40)
    comments = models.ManyToMany(Comment)

class UserProfile(models.Model):
    user = models.ForeignKey(User, unique = True)
    comments = models.ManyToMany(Comment)

class Comment(models.Model):
    text = models.TextField()
    author = models.ForeignKey(User)
    timestamp = models.DateTimeField(auto_now_add = True)

Правильна ли логика в этих моделях?Я сомневаюсь, потому что этот способ означает, что Product может иметь много комментариев (и это правильно), но также Comment может иметь много продуктов (я не думаю, что это правильно).

Это не«т

1 Ответ

3 голосов
/ 16 июля 2011

Ваш комментарий должен иметь ForeignKey для UserProfile или продукта, т. Е. Один комментарий может принадлежать только одному продукту или профилю пользователя, но профиль / продукт пользователя может иметь много разных комментариев

def Comment(models.Model):
    profile = models.ForeignKey(UserProfile)
    product = models.ForeignKey(Profile)

Очевидно, что это не идеально, так как вам нужно управлять двумя отношениями, а иногда вам захочется использовать только одно и т. Д.

Чтобы преодолеть это, вы можете использовать общий внешний ключ:

https://docs.djangoproject.com/en/dev/ref/contrib/contenttypes/#generic-relations

позволяет связать комментарий с любым типом контента (продукты, профили пользователей и т. Д.) Без предварительного указания моделей

def Comment(models.Model):
    ...
    content_type = models.ForeignKey(ContentType)
    object_id = models.PositiveIntegerField()
    content_object = generic.GenericForeignKey('content_type', 'object_id')
...