Джанго Многие Много сомнений - PullRequest
1 голос
/ 17 июля 2011

У меня есть эти модели:

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

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

class Product(models.Model):
    title = models.CharField(max_length = 30)
    comments = models.ManyToManyField(Comment)

Я знаю, что есть django.contrib.comments, но сейчас я пишу свою собственную систему комментариев.

Любой объект UserProfile и Product может иметь список комментариев. Это логически правильно?

Я сомневаюсь: ManyToManyField означает:

  • у объекта A много объектов B, поэтому у объекта B много объектов A
  • или много объектов A имеет много объектов B?

Какое это правильное предложение? Потому что, если он первый, мой макет модели неправильный, потому что (например) у продукта много комментариев, а у комментария НЕ много товара.

Можете ли вы прояснить мои сомнения?

1 Ответ

1 голос
/ 17 июля 2011

Ваше первое утверждение верно, для ManyToManyField"у объекта A много объектов B, поэтому у объекта B много объектов A"

Обратите внимание, что при определении

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

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

Существует неявный вид ManyToManyField, определенный для Comment для UserProfile, например

class Comment(models.Model):
    text = models.TextField(max_length = 300)
    author = models.ForeignKey(User)
    timestamp = models.DateTimeField(auto_now_add = True)
    userprofiles = models.ManyToManyField(UserProfile)

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

Фактически вы можете определить таблицу «многие ко многим» в любом случае.

Как вы уже заметили, определение вашей модели не работает с двумя ManyToManyFields . То, что вы хотите использовать, - это GenericForeignKey , который может присоединять что угодно к чему-либо еще (именно так работает структура комментирования IIRC).

Что-то вроде

from django.db import models
from django.contrib.contenttypes.models import ContentType
from django.contrib.contenttypes import generic

class Comment(models.Model):
    text = models.TextField(max_length = 300)
    author = models.ForeignKey(User)
    timestamp = models.DateTimeField(auto_now_add = True)
    content_type = models.ForeignKey(ContentType)
    object_id = models.PositiveIntegerField()
    content_object = generic.GenericForeignKey('content_type', 'object_id')
...