Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何使用对自身的引用来定义Django模型?_Python_Django_Django Models_Python 2.5 - Fatal编程技术网

Python 如何使用对自身的引用来定义Django模型?

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)

我是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)
    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参数(尽管我没有输入它们)。