0

请问如何使用模型@property 方法过滤视图中的查询集。

class TransactionData(models.Model):
    Nozzle_address = models.CharField(max_length=255)
    Device = models.ForeignKey(Devices, on_delete=models.CASCADE)
    Site = models.ForeignKey(Sites, on_delete=models.CASCADE, enter code hererelated_name='transaction_data')
    Pump_mac_address = models.CharField(max_length=255)

   
    @property
    def product_name(self):
        try:
            return f'{(Nozzle.objects.filter(Pump__Device__Device_unique_address=self.Pump_mac_address,Nozzle_address=self.Nozzle_address)).Product.Name}'
        except :
            pass

基本上我希望能够在这样的视图中编写查询:

filters_product = models.TransactionData.objects.filter(Site=Site_id, product_name='kero')

但是 django 不支持这个。我想我需要编写一个自定义管理器,然后我可以像这样查询

filters_product = models.TransactionData.objects.filter(Site=Site_id).product_name('Key')

问题是在属性方法product_name中使用了另一个模型,如Nozzle

请问我怎样才能完成这项工作......我知道我需要使用自定义管理器或查询集来完成这项工作,但不能只是弄清楚......我非常感谢你的帮助。谢谢

@Amin 我按照您的建议使用了注释,但由于self引用了模型实例因此未定义,因此不起作用...感谢任何帮助。IE

models.TransactionData.objects.annotate(product_name=(models.Nozzle.objects.filter(Pump__Device__Device_unique_address=self.Pump_mac_address,Nozzle_address=self.Nozzle_address)).Product.Name)
4

1 回答 1

0

您应该使用注释:

models.TransactionData.objects.annotate(product_name=YOUR_ANNOTATION)

之后,您可以product_name作为字段访问并按此过滤

文档:https ://docs.djangoproject.com/en/3.2/ref/models/querysets/#annotate

于 2021-11-04T07:04:50.517 回答