如何根据其他ForeignKey过滤ForeignKey的选项

时间:2017-12-23 18:16:04

标签: django

我需要根据其他ForeignKey过滤ForeignKey的选项。

class LabValue(models.Model):

    measurement = models.ForeignKey(
        'LabMeasurement', on_delete=models.CASCADE)


    unit = models.ForeignKey(
        LabMeasurementUnit,
        on_delete=models.CASCADE,
        limit_choices_to={'parameter__id': self.measurement.parameter.id},
    )

如何检索self.measurement.parameter.id?如果我手动输入ID而不是self.measurement.parameter.id,例如“1”,则查询可以正常工作。

  def __str__(self):
        return str(self.measurement.parameter.id)

也按预期工作并返回e。 G。 1结果

2 个答案:

答案 0 :(得分:0)

我不相信这是可能的,不是由于Django的ORM,而是由于数据库本身的工作方式。 measurementForeignKey,因此它是两个表之间的关系。但表之间的关系不涉及过滤。

因此,您必须在更新模型的表单级别实现此功能,或者,如果不满足所需的期望,则覆盖模型的save函数并抛出错误。

答案 1 :(得分:0)

一个非常明确的答案:你做不到。 说明: 这是一个django模型,当你创建模型对象/保存时,只创建了你的model object,并且在那个时候传递了指定实例的有效外键,因此不能直接对特定的选择进行建模。需要从视图中处理它。

因此,如果您已处理view中的选项选项,但您可以覆盖clean()方法来引发错误。

在模型中你可以使用如下的清洁方法:

def clean(self):
    if self.measurement.parameter.id == 1:
        # .. do whatever you want to write if this condition happens
        pass
    elif self.measurement.parameter.id in [1,2,3,4,55,6]: # or just pass set of ids, statically or with queryset
        # .. code
    else:
        raise Exception("Unexpected selection of choice!!!")