如何使用foreignkey和limit_choices_to属性限制django模型中一个字段相对于前一个字段的选择?

gc0ot86w  于 2023-03-24  发布在  Go
关注(0)|答案(1)|浏览(158)
class Property(models.Model):
    property_name = models.CharField(max_length=100)
    unit_name = models.CharField(max_length=100)

class Tenant(models.Model):
    tenant_name = models.CharField(max_length=100)
    rent_unit = models.ForeignKey(Property, on_delete=models.SET_NULL)

class Payment(models.Model):
    payment_name = models.ForeignKey(Tenant, on_delete=models.SET_NULL)
    payment_property = models.ForeignKey(Property, on_delete=models.SET_NULL, limit_choices_to={
        'pk__in': Property.objects.filter(unit_name=models.OuterRef('payment_name__rent_unit__unit_name'))
    })

我尝试使用Django的ForeignKey.limit_choices_to属性和子查询来限制Payment模型中的payment_property字段的选择,该字段基于Tenant模型中所选的rent_unit。但是当我尝试执行makemigrations. ValueError: This queryset contains a reference to an outer query and may only be used in a subquery.时,我得到了这个错误
当我创建一个新的Payment对象并选择一个Tenant对象时,我希望得到一个payment_property的单一选择,payment_property字段的可用选择应限于与所选Tenant对象的rent_unit具有相同unit_name的Property对象。

pgky5nke

pgky5nke1#

如果你想要链接外键,那么你可以使用第三方包django-smart-selects。要查看文档click here
但如果你想自己做,也可以自己做,先创建一个API,把payment_name的值作为参数发送,api会返回给你payment_property过滤选项,在选择payment_name之前,payment_property选项为空,选择payment_name之后,用javascript调用api,获取payment_property的过滤选项,并将选项添加到选择选项中。

相关问题