如何在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
都不足以满足的处方,应为空列表