2011-07-16 130 views
1

我有这个型号:Django的多对多怀疑

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具有许多对象乙?

哪一个这是正确的句子?因为如果它是第一个,我的模型布局是错误的,因为(例如)产品有很多评论,但评论没有很多产品。

你能澄清我的疑问吗?

回答

1

你的第一个说法是正确的,对于ManyToManyField “对象的有许多物体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) 

有是在UserProfile注释上定义的一种隐含的ManyToManyField,例如

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')