2011-07-16 181 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')