主要有3种模型:动物
、机器人
、人
。每个 Photo
模型上都有一个外键。在 Photo
模型中,我重写了 save(self, *args, **kwargs)
方法。
class Photo(models.Model):
file = models.ImageField()
is_alive = models.BooleanField(default=True, editable=False)
def save(self, *args, **kwargs):
if #main_model# == 'Robot':
self.is_alive = False
super().save(*args, **kwargs)
class Animal(models.Model):
name = models.CharField(max_length=50)
photo = models.OneToOneField(Photo, on_delete=models.CASCADE)
class Robot(models.Model):
name = models.CharField(max_length=50)
photo = models.OneToOneField(Photo, on_delete=models.CASCADE)
class Human(models.Model):
name = models.CharField(max_length=50)
photo = models.OneToOneField(Photo, on_delete=models.CASCADE)
当我从管理员填充任何主要模型时,我正在创建一张照片,该照片将在创建后立即分配给模型(我正在填充)作为外键。我如何从 save(self, *args, **kwargs)
方法知道现在正在创建哪个主要模型?
def save(self, *args, **kwargs):
if #main_model# == 'Robot':
self.is_alive = False
super().save(*args, **kwargs)
或者,也许还有其他方法可以做到这一点?预先感谢您,任何帮助将不胜感激。
最佳答案
由于在保存 OneToOne 的“其他伙伴”之前您无法知道照片
是否属于机器人,因此应在您保存之后设置 is_alive = False
已保存 Robot
实例。换句话说:
class Robot(BeepBoop):
def save(self,*args,**kwargs):
super().save(*args,**kwarg)
self.photo.is_alive = False
self.photo.save()
在更改照片的“所有者”时,这仍然会带来问题。假设机器人的照片与人类的照片交换。男人的照片将有 is_alive = False
(因为它之前属于机器人)。
这样做可能会更好:
class Being(models.Model):
name = models.CharField(max_length=50)
photo = models.OneToOneField(Photo, on_delete=models.CASCADE)
def save(self, is_alive = True, *args, **kwargs):
super().save(*args, **kwargs)
self.photo.is_alive = is_alive
self.photo.save()
class Animal(Being):
pass
class Man(Being):
pass
class Robot(Being):
def save(self, *args, **kwargs):
super().save(is_alive = False, *args, **kwargs)
关于python - 从管理员检测哪个模型创建并分配外键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53086839/