python - 从管理员检测哪个模型创建并分配外键

标签 python django

主要有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) 方法知道现在正在创建哪个主要模型?

screenshot-1

screenshot-2

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/

相关文章:

python - (Python)如何让用户打开一个文本文件,然后更改一个整数/数字

python - Rabbitmq hello world 连接仅适用于本地主机(python)

django - 在一个字段上过滤并在另一个字段上排序时 Django 模型的最佳索引

python - 从 NLTK 中的 token 中删除 URL 特征

Django:使用注册了不同模型的 2 个不同的 AdminSite 实例

python - Django 从模型或 View 调用 REST API?

python - setattr、对象删除和循环垃圾回收

python - 即使退出后,环境变量也会保留在 Python 脚本中

python - Django:按月查询分组

python - Django RaspberryPi 无法连接到网络服务器