Я обновляю код с 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?