【问题标题】:Check if object with OneToOneField is new or already exists检查具有 OneToOneField 的对象是新对象还是已经存在
【发布时间】:2013-02-08 00:39:27
【问题描述】:

检查对象是否为新对象的常见模式是测试:

self.pk is not None

如In a django model custom save() method, how should you identify a new object?中所述

但是当对象与其他对象是一对一的关系时,它就不是真的了,比如说:

class X(models.Model):
     bla = models.OneToOneField(Bla)

如果我想创建这个对象实例并将其保存到数据库中,我会这样做:

x = X(bla=someBla)
x.save()

而且 x.pk 从一开始就不是 null 而是 x.pk = someBla.pk。

那么有没有可能检查这样一个对象是新的还是编辑的?

【问题讨论】:

    标签: python django orm django-models


    【解决方案1】:
    new  =  not bool(X.objects.filter(pk=self.pk).count())
    

    【讨论】:

    • 如果不是 self._meta.model.objects.filter(pk=self.pk).count()
    【解决方案2】:

    self.pk in save 方法在这种情况下将为 None,但请确保您在类 X 的 save() 方法中调用 super.save() 之前检查了此 。

    【讨论】:

    • def save(self, force_insert=False, force_update=False, *args, **kwargs): print ("pk=%s") % self.pk 从不显示无,所以不是真的.
    • 对不起,我的错。为什么不将 ForeignKey 与 unique=True 一起使用? See the differences。至于为什么会发生这种情况,根据该线程中的答案,OneToOneField 表示组合,因此在实例化时分配相关对象的主键是有意义的。
    • 因为我需要一些额外的 id 列。我正在使用旧数据库,我不能只将 OneToOne 更改为 ForeignKey。
    • 在这种情况下,唯一的选择就是在save方法中查询数据库,看对象是否存在,并采取相应的行动(X.objects.get(pk=self.pk)并捕获DoesNotExist )。
    • 差不多了,但我将使用 filter.count() 来避免引发异常,而不是 get。
    猜你喜欢
    • 1970-01-01
    • 2011-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-26
    • 1970-01-01
    • 2017-02-24
    相关资源
    最近更新 更多