我有这个模型:
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?
哪一个是正确的句子?因为如果是第一个,则我的模型布局是错误的,因为(例如)一个产品有很多注释,但一个注释没有很多产品。
你能澄清我的疑问吗?
最佳答案
您的第一个陈述是正确的,对于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)
在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')
关于python - Django ManyToMany疑问,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6720624/