2011-07-16 18 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は多くのオブジェクトにBを持っていますか?

どちらが正しい文ですか?最初の製品であれば、私のモデルのレイアウトは間違っています。たとえば、製品には多くのコメントがありますが、コメントには多くの製品がないためです。

疑問を明確にすることはできますか?

答えて

1

あなたの最初の文はあなたが

あり
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 "Aそう、オブジェクトBは、多くのオブジェクトを持っている、B多くのオブジェクトを持つオブジェクト" のために、正しいです実際に

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) 

はあなたに多くを定義することができ、例えばのUserProfileのためのコメントに定義された暗黙的のManyToManyFieldの一種であります多くのテーブルのいずれかの方法ラウンド。

あなたのモデルの定義は、2つの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')