Жалоба на ограничение Dajango FK, но объект есть. Чего мне не хватает?
Я нахожусь на моем первом приложении Django, пожалуйста, потерпите меня...
Он основан на некоторых старых скриптах с существующей базой данных PostgreSQL. Следовательно, именование некоторых таблиц не соответствует схеме именования Django.
В настоящее время я занимаюсь переделкой своих данных, чтобы следовать здравым принципам моделирования данных. При выполнении одного из шагов миграции возникает непонятное мне исключение внешнего ключа:
Есть две Модели, относящиеся к ошибке:
class ShopifyCollection(models.Model):
graph_ql_id = models.CharField(max_length=250, primary_key=True,
validators=[validate_sy_graph_ql_id])
handle = models.CharField(max_length=250, blank=False, null=False,
validators=[validate_slug])
title = models.CharField(max_length=250, blank=False, null=False)
def pk_uuid_gen() -> str:
return str(uuid4())
class Design(models.Model):
uuid = models.CharField(primary_key=True, unique=True, default=pk_uuid_gen,
editable=False, max_length=36)
niche = models.CharField(blank=False, null=True, max_length=50)
id = models.CharField(blank=False, null=True, max_length=4)
variant = models.CharField(blank=False, null=True, max_length=1)
language = models.CharField(max_length=2, default=None)
# the new many 2 many relation to be filled by the migration.
shopify_category = models.ManyToManyField(ShopifyCollection, blank=True)
# the legacy field to get the values from...
shopify_category_tmp = models.JSONField(blank=True, default=empty_development_default)
class Meta:
db_table = 'design'
unique_together = ((niche', 'id', 'variant'),)
А это код миграции:
# Generated by Django 3.2.9 on 2021-11-27 18:00
from django.db import migrations
from django.core.exceptions import ObjectDoesNotExist
from designs.models import Design, ShopifyCollection
def convert_shopify_category_json_objects_to_m2m(apps, schema_editor):
# this doesn't give an error. It's the exact same key the FK exception
# complains about. It's also the first object it want's to add.
x = ShopifyCollection.objects.get(pk='gid://shopify/Collection/263596736569')
for design in Design.objects.all().iterator():
if len(design.shopify_category_tmp) == 0:
continue
# the legacy field holds a list of strings like: ["archery", "outdoor"]
for category in design.shopify_category_tmp:
if len(category) == 0:
continue
sy_col_handles = [
f'niche-de-{category}',
f'featured-de-{category}']
sy_collections = []
for handle in sy_col_handles:
try:
sy_collections.append(ShopifyCollection.objects.get(handle=handle))
except ObjectDoesNotExist:
pass
if len(sy_collections) < 1:
raise ValueError('There are no Shopify Collections for the handles ' +
f'{sy_col_handles}. We need at least one of them.')
design.shopify_category.add(sy_collections)
design.save()
class Migration(migrations.Migration):
dependencies = [
('designs', '0031_shopify_categories_link_them'),
]
operations = [
migrations.RunPython(convert_shopify_category_json_objects_to_m2m),
]
В таблице designs_shopifycollection
хранится строка gid://shopify/Collection/263596736569
перед началом транзакции миграции db, на отсутствие которой жалуется исключение.
Также строка x = ShopifyCollection.objects.get(pk='gid://shopify/Collection/263596736569')
доказывает, что таблица содержит запрашиваемую строку в db транзакции миграции.
В таблице также содержится "недостающая" строка после миграции.
Я пытался отладить проблему через код фреймворка Django, но остановился через некоторое время. Не смог найти больше, чем исключение, вызванное фиксацией...
Также добавление строки в таблицу m2n вручную сработало без проблем и отображается как выбранная в представлении DesignFrom.
У меня закончились идеи. Где может быть проблема?
Вам нужно передать элементы как отдельные параметры, так:
# asterisk ↓
design.shopify_category.add(*sy_collections)