Жалоба на ограничение 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)
Вернуться на верх