【问题标题】: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."如何修复“ValueError:“<Klant:None - aCustomer>”需要为字段“klant”设置一个值,然后才能使用这种多对多关系。”
【发布时间】:2023-03-24 22:15:02
【问题描述】:

这里是导入:

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

这是第二类Klant,意思是客户。它有一个 id、一个客户名称和来自客户的用户,这是一个 ManyToManyField,指的是 django 给我的 User-table 中的用户。

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、一个动作名称、一个引用上面的表状态的动作状态、一个动作发布日期、一个结束 -日期(截止日期)和指向 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?

【问题讨论】:

    标签: python django shell django-models revitpythonshell


    【解决方案1】:

    您的模型看起来像是通过 inspectdb 自动生成的。问题是您所有的主键都是 IntegerFields。这意味着 Django 不知道数据库会自动给它们一个值,因此不会在创建时使用该值更新字段 - 因此无法创建多对多关系,这需要从双方插入 pk进入链接表。

    您可以将字段更改为 AutoField,但最简单的解决方案是完全删除这些定义 - 如果未定义另一个 pk,Django 会自动将主键设置为名为 id 的 AutoField。

    【讨论】:

    • 谢谢,它成功了。我将所有 IntegerFields 更改为 AutoField,并以 'primary_key=True' 作为参数。
    猜你喜欢
    • 1970-01-01
    • 2017-06-01
    • 2019-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-08
    • 1970-01-01
    相关资源
    最近更新 更多