Как я могу исправить "ValueError:"<Klant: None - aCustomer>"должен иметь значение для поля"klant", прежде чем можно будет использовать это отношение" многие ко многим "."

Вот импорт:

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

Это первый класс, который я определил. Это статус действия (Actie), и он имеет идентификатор статуса и имя статуса с атрибутом max_length 5 (todo, do, 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, который означает покупатель. У него есть идентификатор, имя-клиента и пользователи от клиента, который представляет собой ManyToManyField и ссылается на пользователей из таблицы пользователей, которую дает мне 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

Это класс Actie (действие или действие, которое определяет пользователь) с идентификатором, именем действия, состоянием действия, которое ссылается на приведенную выше таблицу "Состояние", дату публикации действия, дату окончания (крайний срок) и идентификатор клиента, который относится к Klant.

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?

1 ответ

Решение

Ваши модели выглядят так, как будто они были сгенерированы автоматически inspectdb, Проблема в том, что все ваши первичные ключи являются IntegerFields. Это означает, что Django не знает, что база данных даст им значение автоматически, поэтому не обновляет поле при создании с этим значением - и, следовательно, не может создать отношение "многие ко многим", которое требует вставки pks с обеих сторон. в таблицу ссылок.

Вы можете изменить поля на AutoField, но самое простое решение - просто полностью удалить эти определения - Django автоматически установит первичный ключ в AutoField с именем id если другой рк не определен.

Другие вопросы по тегам