_delete上的Django外键:如何在使用models.SET时将参数传递给callable
这是my models.py:_delete上的Django外键:如何在使用models.SET时将参数传递给callable,django,foreign-keys,Django,Foreign Keys,这是my models.py: def set_image(instance): return Image.objects.filter(user=instance.user)[0] class User(models.Model): user = models.CharField(max_length=50) class Image(models.Model): user = models.ForeignKey(User) image = models.Im
def set_image(instance):
return Image.objects.filter(user=instance.user)[0]
class User(models.Model):
user = models.CharField(max_length=50)
class Image(models.Model):
user = models.ForeignKey(User)
image = models.ImageField(upload_to='media')
class Item(models.Model):
user = models.ForeignKey(User)
image = models.ForeignKey(
Image,
blank=True,
null=True,
on_delete=models.SET(set_image)
)
当我删除一个“Image”时,它的相关“Item”调用set_Image,这会返回一个错误,因为models.set不会将实例传递给可调用对象。我怎样才能改变这种行为?我应该覆盖models.SET还是有其他解决方法?覆盖图像删除方法以删除项ForeignKey 以下内容可用作中间模型基类,以将此功能添加到所有模型中:
from django.db import models
class Model(models.Model):
"""
Intermediate model base class.
"""
class Meta:
abstract = True
def delete(self, *args, **kwargs):
self.clear_nullable_related()
super(Model, self).delete(*args, **kwargs)
def clear_nullable_related(self):
"""
Recursively clears any nullable foreign key fields on related objects.
Django is hard-wired for cascading deletes, which is very dangerous for
us. This simulates ON DELETE SET NULL behavior manually.
"""
for related in self._meta.get_all_related_objects():
accessor = related.get_accessor_name()
related_set = getattr(self, accessor)
if related.field.null:
related_set.clear()
else:
for related_object in related_set.all():
related_object.clear_nullable_related()