Nano Hash - криптовалюты, майнинг, программирование

Python, Django — ValueError: ‹› необходимо иметь значение для поля, прежде чем можно будет использовать это отношение «многие ко многим».

Уважаемое сообщество StackOverflow. Мой вопрос связан со вставкой новой записи в таблицу, содержащую поле many2many fields.

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

Мои модели.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

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

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..