How to define a Django model with a reference to itself?

DP_*_*DP_ 1 python django django-models python-2.5

I'm new to Django and currently write an application, where users can enter their opinions on some topic.

Every opinion A may have zero or more opinions, which support A and several (zero or more) opinions, which refute A.

I tried to create a model for this and wrote a models.py file like this:

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")
Run Code Online (Sandbox Code Playgroud)

When I run python manage sqlall, I get following error:

  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
Run Code Online (Sandbox Code Playgroud)

How can I fix this error?

Tho*_*mas 6

来自以下的文档ManyToManyField:

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

哪个:

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

所以:

proArguments = models.ManyToManyField("self", verbose_name="Pro arguments")
contraArguments = models.ManyToManyField("self", verbose_name="Contra arguments")
Run Code Online (Sandbox Code Playgroud)

如果参数被认为是意见,我对你的数据模型有点疑惑,但这是另一回事.