Python 在使用Django Rest ModelSerializer序列化数据时,如何拒绝queryset对象?
我有一个查询集,我正试图用继承Django REST FrameworkPython 在使用Django Rest ModelSerializer序列化数据时,如何拒绝queryset对象?,python,django,django-rest-framework,Python,Django,Django Rest Framework,我有一个查询集,我正试图用继承Django REST FrameworkModelSerializer类的CasePartySerializer序列化它。它有一个名为CaseRuleDocketSerializer的嵌套序列化程序 下面是我如何实例化它的 def get_queryset(self): self.queryset=CaseParty.objects.filter(用户=self.request.user) def get(自我): 串行=CasePartySerializer(
ModelSerializer
类的CasePartySerializer
序列化它。它有一个名为CaseRuleDocketSerializer
的嵌套序列化程序
下面是我如何实例化它的
def get_queryset(self):
self.queryset=CaseParty.objects.filter(用户=self.request.user)
def get(自我):
串行=CasePartySerializer(
名单(
自我查询集[
自偏移:自偏移+自限
]
),
多=真,
上下文={
“跟踪”:self.tracked.value,
“请求”:self.request
}
)
很简单,但是如果我想有条件地传递和拒绝对象,使它们不包含在最终确定的serial.data
中,该怎么办呢
我确信我可能会提出一些异常,这些异常会传递给这个数据库对象,但我不确定会是什么。我很幸运地查阅了文件;考虑到REST框架文档的质量,我感到非常惊讶。我可能错过了一些简单的东西
这是我的CasePartySerializer
,您可以看到我的条件。在本例中,您可以看到它们基于嵌套序列化程序CaseRuleDocketSerializer
输出的结果,该输出在get\u queryset
方法中不可用。如果其中一个ruledocket项为“红色”,则不需要将其包含在序列化程序结果中。我知道我也可以在get\u queryset
方法中进行过滤,但似乎在序列化程序本身中进行过滤会更容易
class CaseRuleDocketSerializer(serializers.ModelSerializer):
table_row_color=serializers.SerializerMethodField()
类元:
模型=案例规则摘要
字段=[
“唯一id”,
“创建日期”,
“更新日期”,
“日期和时间”,
“入口”,
“派对”
]
def get_仅为用户_创建(self,obj):
如果创建了obj.is\U user\U而不是obj.is\U COUNT\U:
返回“绿色”
elif obj.is_court_已创建,而非obj.is_user_已创建:
返回“蓝色”
其他:
返回“红色”
类CasePartySerializer(serializers.ModelSerializer):
第三方的摘要=CaseRuleDocketSerializer(多个=真,只读=真)
table_row_color=serializers.SerializerMethodField()
类元:
模型=案例当事人
字段=[
“被跟踪了吗”,
“创建日期”,
“更新日期”,
“服务身份”,
“送达状态和日期”,
“被告”,
“原告”,
#继续处理其余字段。。。。
]
def get_表格_行_颜色(自身、obj):
错误=[
x、 表\u行\u self.obj.docket\u party中x的颜色
]
如果出现“蓝色”错误:
返回“蓝色”
错误中的elif“绿色”:
返回“绿色”
其他:
#这里是我想要删除的地方
#此CaseParty对象实例
我已经使用stackoverflow很多年了,我总能找到我需要的答案。由于某种原因,我找不到一种方法来正确地阐述这个问题。此外,我熟悉文档,并已彻底阅读。如果由于效率、可读性或其他原因,我不建议在查询集内部进行筛选,请在回答中说明原因
如果你需要澄清,请告诉我
谢谢 根据您的示例,您正在筛选所有没有相关
CaseTrack
模型的CaseParty
实例,您最好更新视图的get\u queryset
方法
基本上,您不需要使用queryset=CaseParty.objects.all()
,而可以编写自己的get\u queryset(self)
方法,该方法将过滤掉不需要的模型
举一个更具体的例子:
类MyViewSet(ModelViewSet):
def get_queryset(自我):
#我们把所有的派对实例都拿来
party\u instances=CaseParty.objects.all()
#我们找到了所有与他们有关的案件线索
case\u tracks=CaseTrack.objects.get(
user=self.request.user,
案例中=当事人实例
)
#我们从案件线索中提取当事人身份
参与方_id_from_casetracks={item.case.id for item in case_tracks}
#我们只把那些派对留在queryset
party_instances_with_tracks=[如果party_id_中的item.id来自_casetracks,则party_实例中的item对应于item]
返回方\u实例\u带有\u轨道
您将在中找到更多示例
如果由于不同的端点/视图必须具有不同的过滤器,因此在视图集级别进行过滤有问题,则只需在视图操作中进行过滤即可
正如其他人在评论中提到的,序列化程序不是用来过滤数据的:
- 视图过滤数据(queryset、get_queryset、filter_queryset、detail视图等)
- 序列化程序接收数据、验证数据、创建/更新/销毁实例、返回表示和内部值
ModelSerializer
基类代码,然后搜索一个可以重写为的方法