代码之家  ›  专栏  ›  技术社区  ›  Genarito

Django获取外键的普通值

  •  0
  • Genarito  · 技术社区  · 5 年前

    我有以下型号:

    def MyModel(models.Model):
      other = models.ForeignKey(OtherModel, db_column='other', on_delete=models.DO_NOTHING, db_constraint=False, blank=True, null=True)
    

    问题是 other 字段(这是一个 字符串值 )模型的 MyModel 不可能在 OtherModel

    inst = MyModel.objects.first()  # Gets any (with an "invalid" key in other)
    inst.other
    

    它抛出:

    我想,如果它不存在,得到 其他 现场。我怎么能做到呢?

    1 回复  |  直到 5 年前
        1
  •  1
  •   willeM_ Van Onsem    5 年前

    可以将逻辑封装在属性(或方法)中:

    def MyModel(models.Model):
        other = models.ForeignKey(
            OtherModel,
            db_column='other',
            on_delete=models.DO_NOTHING,
            db_constraint=False,
            blank=True,
            null=True
        )
    
        @property
        def other_or_value(self):
            try:
                return self.other
            except OtherModel.DoesNotExist:
                return self.other_id

    mymodelobject.other_or_value

    不过,我不确定这是个好主意。现在,该方法可以返回两种类型的对象,通常情况下,这使得处理结果更加复杂。这也意味着数据库也是如此:它不能再保证引用完整性。虽然有关引用不存在的对象的错误很烦人,但是忽略这些错误的替代方法通常更糟糕。

    推荐文章