1

我是 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

我该如何解决这个错误?

4

3 回答 3

6

来自文档ManyToManyField

需要一个位置参数:模型相关的类。这与它的工作原理完全相同ForeignKey,包括有关递归和惰性关系的所有选项。

其中

要创建递归关系(与自身具有多对一关系的对象),请使用models.ForeignKey('self').

所以:

proArguments = models.ManyToManyField("self", verbose_name="Pro arguments")
contraArguments = models.ManyToManyField("self", verbose_name="Contra arguments")

如果参数也被视为意见,我有点想知道您的数据模型,但这是另一回事。

于 2012-11-27T21:09:24.223 回答
2

你将不得不使用自我。因为,你有两个 m2m 自我关系,你需要添加一个 related_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')
于 2012-11-27T21:15:57.010 回答
1

做到这一点的方法是使用“自我”

proArguments = models.ManyToManyField('self', verbose_name="Pro arguments")
contraArguments = models.ManyToManyField('self', verbose_name="Contra arguments")

来自 django 文档:

要创建递归关系(与自身具有多对一关系的对象),请使用 models.ForeignKey('self')。

于 2012-11-27T21:09:01.663 回答