0

インポートは次のとおりです。

from django.db import models
from datetime import datetime, timedelta
from django.contrib.auth.models import User

これは私が定義した最初のクラスです。これはアクション (Actie) のステータスであり、status-id と status-name があり、max_length 属性は 5 (todo、doing、done) です。

class Status(models.Model):
    id = models.IntegerField(primary_key=True)
    status_naam = models.CharField(max_length=5, default='todo')

    def __str__(self):
        return str(self.id) + " - " + self.status_naam

これは顧客を意味する 2 番目のクラスの Klant です。ID、顧客名、および顧客のユーザーがあり、これは、django が提供する User-table のユーザーを参照する ManyToManyField です。

class Klant(models.Model):
    id = models.IntegerField(primary_key=True)
    klant_naam = models.CharField(max_length=100, default='-')
    klant_gebruiker = models.ManyToManyField(User)

    def __str__(self):
        return str(self.id) + " - " + self.klant_naam

これはクラス Actie (アクションまたはユーザーが決定するアクション) であり、ID、アクション名、上記のテーブル Status を参照するアクションステータス、アクション公開日、終了日 (締め切り) と Klant を参照する顧客 ID。

class Actie(models.Model):
    id = models.IntegerField(primary_key=True)
    actie_naam = models.CharField(max_length=150, default='-')
    actie_status = models.ForeignKey(Status, default=1)
    actie_aanmaakdatum = models.DateTimeField(default=datetime.now())
    actie_einddatum = models.DateTimeField(default=datetime.now() + timedelta(days=1))
    actie_klant = models.ForeignKey(Klant, default=1)

    def __str__(self):
        return str(self.id) + " - " + self.actie_naam

これは私がシェルでやっていることです:

(InteractiveConsole)
    >>> from MyApp.models import User, Klant
    >>> klant1 = Klant.objects.create(klant_naam='aCustomer')
    >>> user1 = User.objects.get(username='peterdevries')
    >>> klant1.klant_gebruiker.add(user1)
    Traceback (most recent call last):
      File "C:\shell.py", line 69, in handle
        self.run_shell(shell=options['interface'])
      File "C:\shell.py", line 61, in run_shell
        raise ImportError
    ImportError
    
    During handling of the above exception, another exception occurred:
    
    Traceback (most recent call last):
      File "<console>", line 1, in <module>
      File "C:\related_descriptors.py", line 468, in __get__
        return self.related_manager_cls(instance)
      File "C:\related_descriptors.py", line 751, in __init__
        (instance, self.source_field_name))
    ValueError: "<Klant: None - aCustomer>" needs to have a value for field "klant" before this many-to-many relationship can be used.
    >>>

だから私の質問は、このValueErrorを修正するために何をしなければならないのですか?

4

1 に答える 1

2

あなたのモデルは、 経由で自動生成されたように見えますinspectdb。問題は、すべての主キーが IntegerFields であることです。これは、Django がデータベースがそれらに自動的に値を与えることを知らないことを意味します。そのため、作成時にフィールドをその値で更新しません。したがって、両側から pks を挿入する必要がある多対多の関係を作成できません。リンクテーブルに。

idフィールドを AutoField に変更することもできますが、最も簡単な解決策は、それらの定義を完全に削除することです。別の pk が定義されていない場合、Django は名前付きの AutoField に主キーを自動的に設定します。

于 2018-11-14T11:52:35.923 に答える