Django с одной базой данных вызывает ошибку «текущий маршрутизатор базы данных не позволяет установить это отношение» при инициализации модели

В django у меня есть следующие модели баз данных:

  • ParentA
  • ParentB
  • Connector, который имеет внешний ключ, ссылающийся на модель ParentA, и внешний ключ, ссылающийся на модель ParentB

Модель Connector:

from django.db import models


class Connector(models.Model):
    class Meta:
        ordering = ["parent_a"]
        unique_together = (("parent_a", "parent_b"),)

    parent_a = models.ForeignKey(
        ParentA,
        on_delete=models.CASCADE,
        related_name="connected_bs",
    )
    parent_b = models.ForeignKey(
        ParentB,
        on_delete=models.CASCADE,
        related_name="connected_as",
    )

В моем коде каждый раз, когда создается ParentA объект, я нахожу, какие существующие ParentB объекты могут быть связаны с ним, и создаю Connector объекты с помощью следующего кода. Функция, создающая Connector объекты, является методом ParentA, поэтому self вот ParentA объект

from django.db import models


class ParentA(models.Model):

    ...

    def create_connectors(self):
        matching_p_b_objects = self.__get_matching_parent_b_objects()
        new_matching_p_b_objects = matching_p_b_objects.filter(~Q(connected_as__parent_a=self))
        Connector.objects.bulk_create(
            [
                Connector(parent_a=self, parent_b=parent_b)
                for parent_b in new_matching_p_b_objects
            ]
        )

Функция вызывается постоянно, и в основном она работает, но иногда случайно выкидывает ошибку

  File "/code/backend/app/models/parent_a.py", line 989, in create_connectors
    [
  File "/code/backend/app/models/parent_a.py", line 990, in <listcomp>
    Connector(parent_a=self, parent_b=parent_b)
  File "/usr/local/lib/python3.10/site-packages/django/db/models/base.py", line 541, in __init__
    _setattr(self, field.name, rel_obj)
  File "/usr/local/lib/python3.10/site-packages/django/db/models/fields/related_descriptors.py", line 254, in __set__
    raise ValueError(
ValueError: Cannot assign "<ParentA: 340459>": the current database router prevents this relation.

Я использую одну базу данных postgres 17 с python3.10 и django==4.0.3

Кроме того, хотя это может быть и не связано, в другом месте кода я получаю ValueError: save() prohibited to prevent data loss due to unsaved related object 'parent_a'., хотя я явно вызываю parent_a.save() на предыдущем шаге.

Few months back, I faced a similar issue. Try passing the primary key (id) instead of the whole object when creating the Connector instances. That should hopefully solve the problem.

Вернуться на верх