В Django Relation Manager что-то изменилось между v1.10 и v3.0? - PullRequest
0 голосов
/ 29 мая 2020

Я обновляю код с Django 1.10 до Django 3.0 и столкнулся с непонятной проблемой, связанной с полями ManyToMany.

Три модели (среди многих других!) Определены следующим образом:

migrations.CreateModel(
    name='DataSet',
    fields=[
        ('id', models.AutoField(auto_created=True, verbose_name='ID', serialize=False, primary_key=True)),
                  :::
    ],
    options={
        'abstract': False,
    },
),

migrations.CreateModel(
    name='SurveyRunDataSet',
    fields=[
        ('dataset_ptr', models.OneToOneField(auto_created=True, parent_link=True, primary_key=True, serialize=False, to='dataset.DataSet', on_delete=django.db.models.deletion.CASCADE)),
        ('survey_run',  models.ForeignKey(help_text='Survey run for the Cassandra responses', to='survey.SurveyRun', null=True, on_delete=django.db.models.deletion.CASCADE)),
                  :::
    ],
    bases=('dataset.dataset',),
),

migrations.CreateModel(
    name='AggregateDataSet',
    fields=[
        ('dataset_ptr', models.OneToOneField(auto_created=True, parent_link=True, primary_key=True, serialize=False, to='dataset.DataSet')),
        ('datasets',    models.ManyToManyField(help_text='Set of datasets for this aggregate', to='dataset.SurveyRunDataSet')),
    ],
    bases=('dataset.dataset',),
),

Но ошибка приложения в строке, указанной ниже:

class AggregateDataSet(DataSet):
    """
    A collection of DataSets with conformant schema items.
    It is assumed that component DataSets have RowKey sets with
    a null intersection.
    """

    datasets = models.ManyToManyField(SurveyRunDataSet, help_text="Set of datasets for this aggregate")

      :::

   def update_datasources(self):

           :::

       self.datasets.clear()                  <--- Fine at Django 1.10, FAILS at Django 3.0

Ошибка указывает на то, что Django 3.0, похоже, думает, что self.datasets является объектом типа «Dataset» ( базовый класс), и у него нет метода clear (). Но из определения очевидно, что набор данных self.datasets должен быть объектом типа SurveyRunDataSet.

Кроме того, я знаю, что существует различие между экземплярами объектов и классами, и метод clear () применяется только к последнее (я думаю). Но если это так, то почему код работает нормально при Django 1.10?!

Итак, в целом, я бы очень хотел понять:

(1) Что это был за код предназначено (очевидно, успешно!) для достижения в Django 1.10. (Я предполагаю, что это было сделано для того, чтобы удалить ссылки «многие ко многим» без удаления каких-либо записей SurveyRunDataSet на другом конце отношения.)

(2) Как я могу изменить его, чтобы он работал в Django 3.0?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...