Python 如何使用对自身的引用来定义Django模型?
我是Django的新手,目前正在编写一个应用程序,用户可以在其中输入对某个主题的意见 每个意见A都可能有零个或多个支持A的意见和几个(零个或多个)反驳A的意见 我试图为此创建一个模型,并编写了一个Python 如何使用对自身的引用来定义Django模型?,python,django,django-models,python-2.5,Python,Django,Django Models,Python 2.5,我是Django的新手,目前正在编写一个应用程序,用户可以在其中输入对某个主题的意见 每个意见A都可能有零个或多个支持A的意见和几个(零个或多个)反驳A的意见 我试图为此创建一个模型,并编写了一个models.py文件,如下所示: from django.db import models # Create your models here. class Opinion(models.Model): id = models.AutoField(primary_key=True)
models.py
文件,如下所示:
from django.db import models
# Create your models here.
class Opinion(models.Model):
id = models.AutoField(primary_key=True)
contents = models.CharField(max_length=256)
source = models.CharField(max_length=256)
proArguments = models.ManyToManyField(Opinion, verbose_name="Pro arguments")
contraArguments = models.ManyToManyField(Opinion, verbose_name="Contra arguments")
运行python manage sqlall
时,出现以下错误:
File "D:\dev\history-site\history_site\opinions\models.py", line 4, in <module>
class Opinion(models.Model):
File "D:\dev\history-site\history_site\opinions\models.py", line 8, in Opinion
proArguments = models.ManyToManyField(Opinion, verbose_name="Pro arguments")
NameError: name 'Opinion' is not defined
文件“D:\dev\history site\history\u site\opinions\models.py”,第4行,在
班级意见(models.Model):
文件“D:\dev\history site\history\u site\opinions\models.py”,第8行,in-Opinion
proArguments=models.ManyToManyField(意见,详细名称=“proArguments”)
NameError:未定义名称“意见”
如何修复此错误?方法是使用“self”
proArguments = models.ManyToManyField('self', verbose_name="Pro arguments")
contraArguments = models.ManyToManyField('self', verbose_name="Contra arguments")
来自django文档:
要创建递归关系(一个与自身具有多对一关系的对象),请使用models.ForeignKey('self')
这样做的方法是使用“自我”
proArguments = models.ManyToManyField('self', verbose_name="Pro arguments")
contraArguments = models.ManyToManyField('self', verbose_name="Contra arguments")
来自django文档:
要创建递归关系(一个与自身具有多对一关系的对象),请使用models.ForeignKey('self')
发件人:
需要位置参数:与模型相关的类。这与ForeignKey
的工作原理完全相同,包括有关递归和惰性关系的所有选项
其中:
要创建递归关系(一个与自身具有多对一关系的对象),请使用models.ForeignKey('self')
因此:
我有点想知道您的数据模型是否也将参数视为意见,但那是另一回事。来自:
需要位置参数:与模型相关的类。这与ForeignKey
的工作原理完全相同,包括有关递归和惰性关系的所有选项
其中:
要创建递归关系(一个与自身具有多对一关系的对象),请使用models.ForeignKey('self')
因此:
我有点想知道你的数据模型是否也将参数视为观点,但那是另一回事。你必须使用self。既然有两个m2m self关系,就需要添加一个相关的_name参数或提供symmetric=False
class Opinion(models.Model):
id = models.AutoField(primary_key=True)
contents = models.CharField(max_length=256)
source = models.CharField(max_length=256)
proArguments = models.ManyToManyField('self', verbose_name="Pro arguments", related_name='my_proargs')
contraArguments = models.ManyToManyField('self', verbose_name="Contra arguments", related_name='my_contraarg')
你必须使用self。既然有两个m2m self关系,就需要添加一个相关的_name参数或提供symmetric=False
class Opinion(models.Model):
id = models.AutoField(primary_key=True)
contents = models.CharField(max_length=256)
source = models.CharField(max_length=256)
proArguments = models.ManyToManyField('self', verbose_name="Pro arguments", related_name='my_proargs')
contraArguments = models.ManyToManyField('self', verbose_name="Contra arguments", related_name='my_contraarg')
我认为论点是观点,但那只是我的观点。因为论点是你的观点,我认为我的观点显然不是论点。但是我们不要有这样的争论,因为它变得非常固执己见。@Thomas有没有办法告诉Django,可能有没有没有争论的观点(当两个集合都为空时)?我将字段定义修改为
proArguments=models.ManyToManyField('self',verbose_name=“Pro arguments',related_name='proargs',null='true',blank='true')
,但当我在管理中创建观点的新实例时,有一个Pro参数和一个contra参数(尽管我没有输入它们)我认为论点是观点,但那只是我的观点。因为论点是你的观点,我认为我的观点显然不是论点。但是我们不要有这样的争论,因为它变得非常固执己见。@Thomas有没有办法告诉Django,可能有没有没有争论的观点(当两个集合都为空时)?我将字段定义修改为proArguments=models.ManyToManyField('self',verbose_name=“Pro arguments',related_name='proargs',null='true',blank='true')
,但当我在管理中创建观点的新实例时,有一个Pro参数和一个contra参数(尽管我没有输入它们)。