2017-01-17 3 views
2

Уважаемый пользователь сообщества StackOverflow. Мой вопрос связан с вставкой новой записи в таблицу, которая содержит много полей полей.Python, Django - ValueError: «<...>» должно иметь значение для поля «...», прежде чем можно использовать отношения «многие ко многим»

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

Мой 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]) 

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

+0

Спасибо очень много. Это решило мою проблему. Но я реализовал это совершенно по-другому. : сл = кланы (..... атрибуты ассигнование ..) cl.save() к.-а. = семьи (....... атрибуты ассигнование ..) fa.save() к.-а.. clan.add (cl) fa.save() Другим важным моментом является то, что когда вы добавляете отношение many2many, в моем случае клан. Аргументом .add() должен быть объект. – Peter