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

Уважаемое сообщество Stackru. Мой вопрос связан с добавлением новой записи в таблицу, которая содержит поле много2 многих полей.

Я провел весь день, пытаясь решить эту проблему самостоятельно, читая документацию по django и занимаясь серфингом в stackru.

Мой models.py:

from django.db import models
from django_extensions.db.models import TimeStampedModel


class clans(TimeStampedModel):
    rfam_acc = models.CharField(max_length=7)
    rfam_id = models.CharField(max_length=40)
    description = models.CharField(max_length=100)
    author = models.CharField(max_length=100)
    comment = models.CharField(max_length=2000, null=True)

    class Meta:
        ordering = ('rfam_id',)

    def __str__(self):
        return self.rfam_id


class families(TimeStampedModel):
    rfam_acc = models.CharField(max_length=7)
    rfam_id = models.CharField(max_length=40)
    description = models.CharField(max_length=75)
    author = models.CharField(max_length=100)
    clan = models.ManyToManyField(clans, null=True, blank=True)
    comment = models.CharField(max_length=2000, null=True)

мой скрипт для сбора данных (из другой базы данных) и вставки в мою БД: (это запускается из manage.py shell_plus).

import mysql.connector
from browse.models import clans, families


def run():

    #... Query from another DB 

    # Query for clans using cursor. assign results to list of lists row_clans
    query_clans = ("SELECT c.clan_acc, c.id, c.description, c.author, c.comment FROM clan c")
    cursor_clans.execute(query_clans)
    row_clans = cursor_clans.fetchall()
# Creation of entry clans in the database.
    for clan in row_clans:
        clap = clans.objects.create(
                rfam_acc=clan[0],
                rfam_id=clan[1],
                description=clan[2],
                author=clan[3],
                comment=clan[4],
                )
# Query for families, that have clan = just created clan. Result in a list of lists row_family.
        query_families = ("SELECT f.rfam_acc, f.rfam_id, f.description, f.author, f.comment, c.id FROM clan_membership cm, family f, clan c WHERE f.rfam_acc = cm.rfam_acc AND cm.clan_acc = c.clan_acc AND c.id =")
        cursor_families.execute(query_families + "\"" + clan[1] + "\"")
        row_family = cursor_families.fetchall()
# Creation of entryes families in the database.
        for family in row_family:
            families.objects.create(
                    rfam_acc=family[0],
                    rfam_id=family[1],
                    description=family[2],
                    author=family[3],
                    comment=family[4],
                    clan=clan[1]
                    )
            print ("insert family ", family[1], " in ", clan[1])

# close the cursors and close the connection to the server
    cursor_clans.close()
    cursor_families.close()
    cnx.close()

И, наконец, ошибка в оболочке:

Traceback (most recent call last):
  File "<console>", line 1, in <module>
  File         "/Users/work/Desktop/StructuRNA/website/scripts/SQLfromRfamIntoClansFamily.py", line 42, in run
clan=clan[1]
  File "/Users/work/Desktop/StructuRNA/.VirEnvStructuRna/lib/python3.6/site-packages/django/db/models/manager.py", line 85, in manager_method
return getattr(self.get_queryset(), name)(*args, **kwargs)
  File "/Users/work/Desktop/StructuRNA/.VirEnvStructuRna/lib/python3.6/site-packages/django/db/models/query.py", line 397, in create
obj = self.model(**kwargs)
  File "/Users/work/Desktop/StructuRNA/.VirEnvStructuRna/lib/python3.6/site-packages/django/db/models/base.py", line 550, in __init__
setattr(self, prop, kwargs[prop])
  File "/Users/work/Desktop/StructuRNA/.VirEnvStructuRna/lib/python3.6/site-packages/django/db/models/fields/related_descriptors.py", line 499, in __set__
    manager = self.__get__(instance)
  File "/Users/work/Desktop/StructuRNA/.VirEnvStructuRna/lib/python3.6/site-packages/django/db/models/fields/related_descriptors.py", line 476, in __get__
return self.related_manager_cls(instance)
  File "/Users/work/Desktop/StructuRNA/.VirEnvStructuRna/lib/python3.6/site-packages/django/db/models/fields/related_descriptors.py", line 783, in      __init__
   (instance, self.source_field_name))
 ValueError: "<families: families object>" needs to have a value for field "families" before this many-to-many relationship can be used.

Любая помощь? Я не могу понять, что не работает.

Еще одна забавная вещь: в моей базе данных я нашел вставку первого элемента (повторялось столько раз, сколько я пытался запустить скрипт). Этот элемент также имеет правильное значение для полей m2m.

1 ответ

Вам нужно создать экземпляр объекта "семейства", прежде чем вы сможете добавить запись в ManyToManyField

family = families.objects.create(
    rfam_acc=family[0],
    rfam_id=family[1],
    description=family[2],
    author=family[3],
    comment=family[4]
)

family.clan.add(clan[1])

Кроме того, вы можете быть заинтересованы в массовом создании: https://docs.djangoproject.com/en/1.10/ref/models/querysets/

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