How can I fix "ValueError: "<Klant: None - aCustomer>" needs to have a value for field "klant" before this many-to-many relationship can be used."
How can I fix "ValueError: "<Klant: None - aCustomer>" needs to have a value for field "klant" before this many-to-many relationship can be used."
这里是导入:
from django.db import models
from datetime import datetime, timedelta
from django.contrib.auth.models import User
这是我定义的第一个class。它是动作 (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
这是第二个 class Klant,意思是客户。它有一个 id、一个客户名称和来自客户的用户,这是一个 ManyToManyField,指的是来自 User-table django 给我的用户。
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
这是 class Actie(动作或用户确定的动作),它有一个 id,一个动作名称,一个动作状态,它指的是上面的 table 状态,一个动作发布日期、一个结束日期(截止日期)和一个指向 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
这就是我在 shell:
中所做的
(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?
您的模型看起来像是通过 inspectdb
自动生成的。问题是您所有的主键都是 IntegerFields。这意味着 Django 不知道数据库会自动给它们一个值,所以不会在创建时用该值更新字段 - 因此无法创建多对多关系,这需要从两侧插入 pks进入链接 table.
您可以将字段更改为 AutoField,但最简单的解决方案是完全删除这些定义 - 如果未定义另一个 pk,Django 会自动将主键设置为名为 id
的 AutoField。
这里是导入:
from django.db import models
from datetime import datetime, timedelta
from django.contrib.auth.models import User
这是我定义的第一个class。它是动作 (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
这是第二个 class Klant,意思是客户。它有一个 id、一个客户名称和来自客户的用户,这是一个 ManyToManyField,指的是来自 User-table django 给我的用户。
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
这是 class Actie(动作或用户确定的动作),它有一个 id,一个动作名称,一个动作状态,它指的是上面的 table 状态,一个动作发布日期、一个结束日期(截止日期)和一个指向 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
这就是我在 shell:
中所做的(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?
您的模型看起来像是通过 inspectdb
自动生成的。问题是您所有的主键都是 IntegerFields。这意味着 Django 不知道数据库会自动给它们一个值,所以不会在创建时用该值更新字段 - 因此无法创建多对多关系,这需要从两侧插入 pks进入链接 table.
您可以将字段更改为 AutoField,但最简单的解决方案是完全删除这些定义 - 如果未定义另一个 pk,Django 会自动将主键设置为名为 id
的 AutoField。