Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/334.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
Python 在使用Django Rest ModelSerializer序列化数据时,如何拒绝queryset对象?_Python_Django_Django Rest Framework - Fatal编程技术网

Python 在使用Django Rest ModelSerializer序列化数据时,如何拒绝queryset对象?

Python 在使用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(

我有一个查询集,我正试图用继承Django REST Framework
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视图等)
  • 序列化程序接收数据、验证数据、创建/更新/销毁实例、返回表示和内部值

查询应在视图中发生。。。你能加上它吗?我很确定有某种方法可以通过exclude或filter语句来实现。是的,在本例中,我完全可以在视图中过滤或排除queryset,但在更动态的序列化程序中,我需要根据父级内部嵌套序列化程序的结果进行过滤或排除。也许我需要尝试用这种语言搜索。另外,我可以只查看
ModelSerializer
基类代码,然后搜索一个可以重写为的方法