我正在重写Django的delete_selected
管理员操作。我有一个通过OneToOneField与另一个模型(Party
)关联的模型(Person
),并且delete_selected
仅删除原始模型,而不删除相关模型中的数据,从而在我的数据库中留下“虚影行”。看起来像这本身可能表明我的代码存在问题,因为我的假设是delete()
函数会级联删除相关模型。通过OneToOneField自定义删除模型和关联模型
无论如何,麻烦的是,我的自定义delete()
函数首先删除Party
,然后Person
的OneToOneField为空并引发错误。想法?
这里是我的模型:
class Party(models.Model):
name = models.CharField(max_length=100)
...
class Person(models.Model):
party = models.OneToOneField(Party, editable=False)
firstName=models.CharField(max_length=60)
lastName=models.CharField(max_length=60)
def delete(self):
self.party.delete()
self.delete()
我的管理员:
class PersonAdmin(admin.ModelAdmin):
actions=['really_delete_selected']
def get_actions(self, request):
actions = super(PersonAdmin, self).get_actions(request)
del actions['delete_selected']
return actions
def really_delete_selected(self, request, queryset):
for obj in queryset:
obj.delete()
if queryset.count() == 1:
message_bit = "1 person was"
else:
message_bit = "%s people were" % queryset.count()
self.message_user(request, "%s successfully deleted." % message_bit)
really_delete_selected.short_description = "Delete selected entries"
...
错误:
AssertionError at /admin/common/person/
Party object can't be deleted because its id attribute is set to None.
非常好!这绝对是一个有趣的情况。 – Furbeenator 2012-03-01 22:48:13