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

Вот импорт:

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

Это первый класс, который я определил. Это статус действия (Actie), и он имеет идентификатор статуса и имя статуса с атрибутом max_length 5 (todo, выполняется, 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 Ответ

0 голосов
/ 14 ноября 2018

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

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

...