Django-PolymorphicModels - 删除实例时出错
Django-PolymorphicModels - Error when deleting an instance
这是我第一次尝试 'PolymorphicModel',也许我做错了什么或者我正在尝试做一些不受支持的事情。有没有办法解决这个问题?
我的简化模型:
from django.polymorphic import PolymorphicModel
class Question(PolymorphicModel):
description = models.TextField(default='')
compound_question = models.ForeignKey('CompoundQuestion',
on_delete=models.CASCADE,
blank=True,
null=True,
related_name='sub_questions')
bonus_question = models.OneToOneField('BonusQuestion',
on_delete=models.CASCADE,
blank=True,
null=True,
related_name='question')
class SimpleQuestion(Question):
pass
class CompoundQuestion(Question):
pass
class BonusQuestion(Question):
pass
如果我创建必要的实例,
compound_q = CompoundQuestion()
compound_q.save()
simple_q2 = SimpleQuestion(compound_question=compound_q)
simple_q2.save()
bonus_q = BonusQuestion(compound_question=compound_q)
bonus_q.save()
simple_q1 = SimpleQuestion(bonus_question=bonus_q)
simple_q1.save()
所以最后我得到:
compound_q.sub_questions.all()
>>> <PolymorphicQuerySet [<BonusQuestion: BonusQuestion object (5)>, <SimpleQuestion: SimpleQuestion object (8)>]>
我做了之后compound_q.delete()
我得到:
Traceback (most recent call last):
File "<console>", line 1, in <module>
File ".../Python/Django/env/lib/python3.6/site-packages/django/db/models/base.py", line 936, in delete
collector.collect([self], keep_parents=keep_parents)
File ".../Python/Django/env/lib/python3.6/site-packages/django/db/models/deletion.py", line 245, in collect
field.remote_field.on_delete(self, field, sub_objs, self.using)
File ".../Python/Django/env/lib/python3.6/site-packages/django/db/models/deletion.py", line 17, in CASCADE
source_attr=field.name, nullable=field.null)
File ".../Python/Django/env/lib/python3.6/site-packages/django/db/models/deletion.py", line 226, in collect
sub_objs = self.related_objects(related, batch)
File ".../Python/Django/env/lib/python3.6/site-packages/django/db/models/deletion.py", line 257, in related_objects
**{"%s__in" % related.field.name: objs}
File ".../Python/Django/env/lib/python3.6/site-packages/django/db/models/query.py", line 904, in filter
return self._filter_or_exclude(False, *args, **kwargs)
File ".../Python/Django/env/lib/python3.6/site-packages/polymorphic/query.py", line 173, in _filter_or_exclude
negate, *(list(q_objects) + additional_args), **kwargs
File ".../Python/Django/env/lib/python3.6/site-packages/django/db/models/query.py", line 923, in _filter_or_exclude
clone.query.add_q(Q(*args, **kwargs))
File ".../Python/Django/env/lib/python3.6/site-packages/django/db/models/sql/query.py", line 1340, in add_q
clause, _ = self._add_q(q_object, self.used_aliases)
File ".../Python/Django/env/lib/python3.6/site-packages/django/db/models/sql/query.py", line 1371, in _add_q
check_filterable=check_filterable,
File ".../Python/Django/env/lib/python3.6/site-packages/django/db/models/sql/query.py", line 1274, in build_filter
self.check_related_objects(join_info.final_field, value, join_info.opts)
File ".../Python/Django/env/lib/python3.6/site-packages/django/db/models/sql/query.py", line 1115, in check_related_objects
self.check_query_object_type(v, opts, field)
File ".../Python/Django/env/lib/python3.6/site-packages/django/db/models/sql/query.py", line 1095, in check_query_object_type
(value, opts.object_name))
ValueError: Cannot query "SimpleQuestion object (8)": Must be "BonusQuestion" instance.
我的模型有问题吗?其他一切似乎都按预期工作。
感谢阅读:)
这似乎是 a known bug in the django-polymorphic package. There is a work around suggested here 将原版 Manager
添加到您的 class 并将此管理器设置为默认管理器
class Question(PolymorphicModel):
non_polymorphic = models.Manager()
class Meta
base_manager_name = 'non_polymorphic'
这是我第一次尝试 'PolymorphicModel',也许我做错了什么或者我正在尝试做一些不受支持的事情。有没有办法解决这个问题?
我的简化模型:
from django.polymorphic import PolymorphicModel
class Question(PolymorphicModel):
description = models.TextField(default='')
compound_question = models.ForeignKey('CompoundQuestion',
on_delete=models.CASCADE,
blank=True,
null=True,
related_name='sub_questions')
bonus_question = models.OneToOneField('BonusQuestion',
on_delete=models.CASCADE,
blank=True,
null=True,
related_name='question')
class SimpleQuestion(Question):
pass
class CompoundQuestion(Question):
pass
class BonusQuestion(Question):
pass
如果我创建必要的实例,
compound_q = CompoundQuestion()
compound_q.save()
simple_q2 = SimpleQuestion(compound_question=compound_q)
simple_q2.save()
bonus_q = BonusQuestion(compound_question=compound_q)
bonus_q.save()
simple_q1 = SimpleQuestion(bonus_question=bonus_q)
simple_q1.save()
所以最后我得到:
compound_q.sub_questions.all()
>>> <PolymorphicQuerySet [<BonusQuestion: BonusQuestion object (5)>, <SimpleQuestion: SimpleQuestion object (8)>]>
我做了之后compound_q.delete()
我得到:
Traceback (most recent call last):
File "<console>", line 1, in <module>
File ".../Python/Django/env/lib/python3.6/site-packages/django/db/models/base.py", line 936, in delete
collector.collect([self], keep_parents=keep_parents)
File ".../Python/Django/env/lib/python3.6/site-packages/django/db/models/deletion.py", line 245, in collect
field.remote_field.on_delete(self, field, sub_objs, self.using)
File ".../Python/Django/env/lib/python3.6/site-packages/django/db/models/deletion.py", line 17, in CASCADE
source_attr=field.name, nullable=field.null)
File ".../Python/Django/env/lib/python3.6/site-packages/django/db/models/deletion.py", line 226, in collect
sub_objs = self.related_objects(related, batch)
File ".../Python/Django/env/lib/python3.6/site-packages/django/db/models/deletion.py", line 257, in related_objects
**{"%s__in" % related.field.name: objs}
File ".../Python/Django/env/lib/python3.6/site-packages/django/db/models/query.py", line 904, in filter
return self._filter_or_exclude(False, *args, **kwargs)
File ".../Python/Django/env/lib/python3.6/site-packages/polymorphic/query.py", line 173, in _filter_or_exclude
negate, *(list(q_objects) + additional_args), **kwargs
File ".../Python/Django/env/lib/python3.6/site-packages/django/db/models/query.py", line 923, in _filter_or_exclude
clone.query.add_q(Q(*args, **kwargs))
File ".../Python/Django/env/lib/python3.6/site-packages/django/db/models/sql/query.py", line 1340, in add_q
clause, _ = self._add_q(q_object, self.used_aliases)
File ".../Python/Django/env/lib/python3.6/site-packages/django/db/models/sql/query.py", line 1371, in _add_q
check_filterable=check_filterable,
File ".../Python/Django/env/lib/python3.6/site-packages/django/db/models/sql/query.py", line 1274, in build_filter
self.check_related_objects(join_info.final_field, value, join_info.opts)
File ".../Python/Django/env/lib/python3.6/site-packages/django/db/models/sql/query.py", line 1115, in check_related_objects
self.check_query_object_type(v, opts, field)
File ".../Python/Django/env/lib/python3.6/site-packages/django/db/models/sql/query.py", line 1095, in check_query_object_type
(value, opts.object_name))
ValueError: Cannot query "SimpleQuestion object (8)": Must be "BonusQuestion" instance.
我的模型有问题吗?其他一切似乎都按预期工作。 感谢阅读:)
这似乎是 a known bug in the django-polymorphic package. There is a work around suggested here 将原版 Manager
添加到您的 class 并将此管理器设置为默认管理器
class Question(PolymorphicModel):
non_polymorphic = models.Manager()
class Meta
base_manager_name = 'non_polymorphic'