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.