Django обмен значений поля - PullRequest
0 голосов
/ 25 марта 2020

У меня есть Django модель, которую я разрабатываю локально, например:

import uuid
from django.db import models

class MyModel(models.Model):
    uuid = models.UUIDField(
        _('Non-sequential key for external lookups'),
        default=uuid.uuid4,
        editable=False,
        null=False,
        unique=True,
    )

Это привело к миграции вроде:

from django.db import migrations, models
import uuid

class Migration(migrations.Migration):
    operations = [
        migrations.CreateModel(
            name='MyModel',
            fields=[
                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                ('uuid', models.UUIDField(unique=True, default=uuid.uuid4, editable=False, verbose_name='Non-sequential key for external lookups')),
    ]

Первоначально это работало отлично; объекты, которые я создал, имели как приростное целое id, так и свойство uuid, с id, сопоставленным с pk. Перемотка вперед на неделю, и мне нужно пересобрать базу данных, чтобы повторно протестировать сценарий миграции, который я пишу. Сценарий не выполняется, и когда я копаюсь в нем, я обнаруживаю, что поля ID и UUID поменялись местами:

$ ./manage.py shell
>>> from my_model import MyModel
>>> item = MyModel.objects.first()
>>> item.pk
UUID('cee60e6b-aa2e-48a2-a34c-4315ebacea0b')
>>> item.id
UUID('cee60e6b-aa2e-48a2-a34c-4315ebacea0b')
>>> item.uuid
45384

Кто-нибудь еще сталкивался с чем-то подобным? Я озадачен тем, что, черт возьми, происходит или что могло измениться. Сторона базы данных выглядит хорошо (первичный ключ в столбце id и уникальный индекс в столбце uuid); это всего лишь отображение Django, это все плохо. Я бегу Django 2.2.9.

1 Ответ

0 голосов
/ 25 марта 2020

Потребовалось некоторое кропотливое копание истории git, но я разыскал таинственную проблему, которая мучила меня!

Оказывается, на прошлой неделе мне нужно было отследить немного информации об этом объекте модели, который был в памяти для Python, но не сохраняется в базе данных. Поэтому я добавил локальное свойство:

from typing import Optional
from django.db import models

class MyModel(models.Model):
    # ...Database column properties here...
    local_property: Optional[str] = None

    def __init__(self, local_property: Optional[str] = None, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.local_property = local_property

Это вызвало смещение кода ассоциации поля Django или что-то в этом роде. Исправление состояло в том, чтобы вытолкнуть мое пользовательское свойство вместо kwargs:

from typing import Optional
from django.db import models

class MyModel(models.Model):
    # ...Database column properties here...
    local_property: Optional[str] = None

    def __init__(self, *args, **kwargs):
        local_property = kwargs.pop('local_property', None)
        super().__init__(*args, **kwargs)
        self.local_property = local_property
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...