如何将过滤器应用于模型序列化程序中不在django-Rest模型中的额外字段



我们有SecurityEventItem,它的owner取自另一个security_location模型并返回。

不将security_location直接作为外键背后的逻辑是,我们获得的事件具有尚未添加到数据库中的security_locationname,但我们希望它们在不将丢失的安全位置添加到数据库的情况下进行注册。


class SecurityEventItemGetSerializer(serializers.ModelSerializer):
epc = RfidTagNestedSerializer()
owner = serializers.SerializerMethodField('get_owner')
def get_owner(self, member):
location = SecurityLocationSerializer(models.SecurityLocation.objects.get(name=member.security_location)).data
owner_name = ProductOwnerSerializer(models.ProductOwner.objects.get(id=location["owner"])).data
return owner_name["owner_name"]
class Meta:
model = models.SecurityEventItem
fields = ["id", "epc", "acknowledged", "firstSeenTimestamp", "security_location", "owner"]

下方的视图集

class SecurityEventItemGetViewset(viewsets.ModelViewSet):
"""SecurityEventItemGet Viewset
API endpoint that allows security event items to be viewed.
Allowed actions:
"GET"
"""
queryset = models.SecurityEventItem.objects.all()
serializer_class = serializers.SecurityEventItemGetSerializer
http_method_names = ['get']
filter_backends = [DjangoFilterBackend]
search_fields = ["owner"]
filterset_fields = {
'acknowledged': ['exact'],
'epc': ['exact', "in"],
'security_location': ['exact', "in"],
'firstSeenTimestamp': ['gte', 'lte'],
}

我尝试过SearchFilter失败,因为它类似于DjangFilterBack,它不识别添加的不属于SecurityEventItem模型的owner字段。

响应是这样的:我想对传递参数"的请求进行筛选;所有者;添加到现有的。

[
{
"id": 73,
"epc": {
"id": 8371,
"number": "1234",
"product": {
"id": 1,
"name": "default_product",
"ean": "",
"description": "default product for foreign/unknown RFID tags",
"category": {
"id": 1,
"name": "default_category",
"description": "default category for foreign/unknown RFID tags"
},
"info": []
},
"state": 1,
"info": [],
"owner": {
"id": 1,
"owner_id": 1,
"owner_name": "George"
}
},
"acknowledged": false,
"firstSeenTimestamp": "2022-02-21T09:44:08",
"security_location": "Test Location",
"owner": "Second Owner"
},
{
"id": 72,
"epc": {
"id": 105177,
"number": "303625D4580B2484000002CA",
"product": {
"id": 590,
"name": "A78R07",
"ean": "5940000792305",
"description": "Fata de perna 50x70",
"category": {
"id": 1,
"name": "default_category",
"description": "default category for foreign/unknown RFID tags"
},
"info": "{"company": "HOTEL Nr1"}"
},
"state": 1,
"info": [],
"owner": {
"id": 1,
"owner_id": 1,
"owner_name": "Regina"
}
},
"acknowledged": false,
"firstSeenTimestamp": "2022-02-21T09:31:16",
"security_location": "Front Desk",
"owner": "Second Company"
}
]

如果有人能教我如何做到这一点,我将不胜感激,有很多关于模型过滤的信息,但没有添加到额外字段的过滤器

SerializerMethodField是只读的。此字段仅在序列化时生成,在数据库中不存在。过滤器仅适用于数据库,但所有者字段不存在。

我认为你应该用你想要的数据(.annotation(owner=…(,Subquery(((来注释查询集,然后过滤器就可以工作了,因为该字段将从数据库中返回。

最新更新