Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在django查询中过滤外键对象?_Django_Django Models_One To Many_Django Orm - Fatal编程技术网

如何在django查询中过滤外键对象?

如何在django查询中过滤外键对象?,django,django-models,one-to-many,django-orm,Django,Django Models,One To Many,Django Orm,我有两个模型,一个通过外键与另一个相关 class CapturedPrescriptionModel(ColModel): p_id = models.IntegerField() p_age = models.IntegerField() p_gender = models.CharField(max_length=10) p_care_type = models.CharField(max_length=100) bacteria_id = mode

我有两个模型,一个通过
外键与另一个相关

class CapturedPrescriptionModel(ColModel):
    p_id = models.IntegerField()
    p_age = models.IntegerField()
    p_gender = models.CharField(max_length=10)
    p_care_type = models.CharField(max_length=100)
    bacteria_id = models.ForeignKey(BacteriaListModel, 
              on_delete=models.CASCADE, null=True)

class SuggestedAntibioticsModel(ColModel):
    prescription_id = models.ForeignKey(CapturedPrescriptionModel, 
                  related_name='antibiotics', 
                   on_delete=models.CASCADE)
    cat_ids = models.TextField()
    flag = models.IntegerField(default=0)
    [
        {
        "id": 7,
        "p_id": 0,
        "p_age": 19,
        "p_gender": "Male",
        "p_care_type": "ICU",
        "bacteria_id": null,
        "antibiotics": [
            {
                "id": 187,
                "cat_ids": "[]",
                "flag": 1,
                "antibiotic_id_id": 112,
                "prescription_id_id": 7
            }
          ]
}
....
]
现在我想要所有的
处方
推荐抗生素
其中
flag=1

我试过使用
capturedDescriptionModel.objects.filter(antiminaties\uu flag=1)
但是它过滤处方,而不是查询集中的抗生素列表

 [
    {
    "id": 7,
    "p_id": 0,
    "p_age": 19,
    "p_gender": "Male",
    "p_care_type": "ICU",
    "bacteria_id": null,
    "antibiotics": [
        {
            "id": 188,
            "cat_ids": "[]",
            "flag": 0,
            "antibiotic_id_id": 87,
            "prescription_id_id": 7
        },
        {
            "id": 187,
            "cat_ids": "[]",
            "flag": 1,
            "antibiotic_id_id": 112,
            "prescription_id_id": 7
        },
      ......
      ]
}
....
]
我的预期结果是这样的

class CapturedPrescriptionModel(ColModel):
    p_id = models.IntegerField()
    p_age = models.IntegerField()
    p_gender = models.CharField(max_length=10)
    p_care_type = models.CharField(max_length=100)
    bacteria_id = models.ForeignKey(BacteriaListModel, 
              on_delete=models.CASCADE, null=True)

class SuggestedAntibioticsModel(ColModel):
    prescription_id = models.ForeignKey(CapturedPrescriptionModel, 
                  related_name='antibiotics', 
                   on_delete=models.CASCADE)
    cat_ids = models.TextField()
    flag = models.IntegerField(default=0)
    [
        {
        "id": 7,
        "p_id": 0,
        "p_age": 19,
        "p_gender": "Male",
        "p_care_type": "ICU",
        "bacteria_id": null,
        "antibiotics": [
            {
                "id": 187,
                "cat_ids": "[]",
                "flag": 1,
                "antibiotic_id_id": 112,
                "prescription_id_id": 7
            }
          ]
}
....
]

收集所有处方:

prescriptions=capturedDescriptionModel.objects.all()
对于处方中的处方:
处方药.抗生素=处方药.抗生素.过滤器(标志=1)
#此时应该准备好处方,只是确保不要保存它们。。。
您还可以扩展模型,使其具有该列表的属性

class CapturedDescriptionModel(ColModel):
p_id=models.IntegerField()
p_age=models.IntegerField()
p_性别=models.CharField(最大长度=10)
p_care_type=models.CharField(最大长度=100)
细菌id=模型。外键(细菌模型,
on_delete=models.CASCADE,null=True)
@财产
def标记的_抗生素(自身):
尝试:
返回self.antiminaties.filter(标志=1)
除例外情况外:
返回[]
类别建议抗生素模型(ColModel):
处方id=models.ForeignKey(CapturedDescriptionModel,
相关的抗生素,
on_delete=models.CASCADE)
cat_id=models.TextField()
flag=models.IntegerField(默认值=0)

类似这样的内容将是我的第一个想法

如果您只想过滤相关对象,而不是主要对象,则需要过滤的
预取

from django.db.models import Prefetch

CapturedPrescriptionModel.objects.prefetch_related(Prefetch(
    'antibiotics',
    queryset=SuggestedAntibioticsModel.objects.filter(flag=1)
)

然后,您必须确保仅使用
prescription.antiminaties.all()
访问各个处方对象上的
antiminaties
,否则不使用预取,您将再次获得所有抗生素。

是否需要所有处方(即使没有
antiminaties\uu flag=1
),但是
抗生素
集合应仅包含
标志=1
的药物?是的,对于任何
抗生素uu标志=1
都不足以满足的处方,应为空列表