我有一个序列化程序,其值来自OneToMany
和ManyToOne
关系。
class A(models.Model):
abc = AnyField()
bcd = AnfField()
class B(models.Model):
xyz = ForeignKey(A)
pqr = CharField()
class C(models.Model):
lmn = ForeignKey(A)
def = CharField()
我的序列化器如下:
class BSerializer(ModelSerializer):
class Meta:
fields = '__all__'
class CSerializer(ModelSerializer):
class Meta:
fields = '__all__'
class ASerializer(ModelSerializer):
B = SerializerMethodField()
C = SerializerMethodField()
class Meta:
fields = ('id', 'abc', 'bcd', 'B', 'C')
def get_B(self, obj):
return BSerializer(queryset=obj.b_set.all(), many=True).data
def get_C(self, obj):
return CSerializer(queryset=obj.c_set.all(), many=True).data
现在,在我看来:
class AListView(ListAPIView):
serializer_class = ASerializer
queryset = A.objects.all()
search_fields = ('id', 'abc', 'bcd', 'B__pqr', 'C__def', )
我想在序列化器字段中搜索。
有没有一种方法可以在B
的字段或“ C”的字段中进行搜索。
我只能使用search_fields
在A
的字段(abc
,bcd
)中进行搜索。
答案 0 :(得分:0)
为了搜索“ B__pqr”和“ C_def”,A模型应与B和C模型处于OneToOne关系。或者您需要在A模型中保持B模型和C模型的外键关系。我想说什么。
class A(models.Model):
abc = AnyField()
bcd = AnfField()
B = Foreignkey(B)
C = Foreignkey(C)
通过这种方式,您可以从A模型中搜索B或C的属性。
另一种可能的解决方案是覆盖列表并返回您的预期响应。但我必须提到,这是一种骇人听闻的解决方案。
def list(self, request):
# searching B_PQR
PQR = self.request.query_params.get('BPQR', None)
# searching C_DEF
DEF = self.request.query_params.get('CDEF', None)
if PQR:
# customly randle your desire outcome and return
# back response
if DEF:
# customly randle your desire outcome and return
# back response
queryset = self.filter_queryset(self.get_queryset())
page = self.paginate_queryset(queryset)
if page is not None:
serializer = self.get_serializer(page, many=True)
return self.get_paginated_response(serializer.data)
serializer = self.get_serializer(queryset, many=True)
// print here
print('response', serializer.data)
return Response(serializer.data)