1

私はDjangoを初めて使用し、現在、ユーザーがいくつかのトピックについて意見を入力できるアプリケーションを作成しています。

すべての意見Aには、Aを支持する0個以上の意見と、Aに反論するいくつかの(0個以上の)意見がある場合があります。

このためのモデルを作成して、次の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これは、再帰的および遅延関係に関するすべてのオプションを含め、の場合とまったく同じように機能します。

それは言う

再帰的な関係(それ自体と多対1の関係を持つオブジェクト)を作成するには、を使用します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

あなたは自分自身を使わなければならないでしょう。また、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のドキュメントから:

再帰的な関係(それ自体と多対1の関係を持つオブジェクト)を作成するには、models.ForeignKey('self')を使用します。

于 2012-11-27T21:09:01.663 に答える