如何根据输入是列表还是单个项目自动设置 django 序列化器的 'many' 标志
How to set automatically 'many' flag of django serializer depending on input being a list or a single item
我有以下 机器 型号。
class Machine(models.Model):
operators = models.ManyToManyField(User, related_name='machines', blank=True)
elasticsearch_id = models.PositiveIntegerField(default=None, null=True, blank=True)
company = models.ForeignKey(Company, default=None, null=True, blank=True,on_delete=models.SET_DEFAULT)
machine_brand = models.CharField(max_length=200, null=False)
machine_model = models.CharField(max_length=200, default='')
machine_picture = models.URLField(max_length=200, null=True)
tools = models.ManyToManyField('Tool', default=None, blank=True)
clustered_tags = JSONField(null=True)
elasticsearch_tags = JSONField(null=True, blank=True, default=DEFAULT_TAG_MAP)
machine_slug = models.SlugField()
使用以下序列化器。
class MachineSerializer(serializers.ModelSerializer):
class Meta:
model = Machine
fields = '__all__'
在我看来,我正在过滤登录用户所属公司的数据。现在,我想序列化对象并将其 return 发送给客户端。但是,我事先不知道查询集是对象列表还是单个对象,因此我可以将序列化程序的 many 标志设置为 true 或 false.
@api_view(['GET','POST'])
def manage_operators(request):
user_machines = Machine.objects.filter(company=request.user.company)
user_machines_ser = MachineSerializer(user_machines, many=True)
return Response({'machines': user_machines_ser.data})
有什么优雅的方法可以解决这个问题吗?我可以这样解决,但必须有更好的方法。
if len(user_machines) > 0 :
user_machine_ser = MachineSerializer(user_machines, many=True)
else:
user_machine_ser = MachineSerializer(user_machines, many=False)
非常感谢任何意见!
由于每次都获取一个QuerySet,如果QuerySet中只有一项,则不必设置many=False
。
所以你可以放心使用
user_machine_ser = MachineSerializer(user_machines, many=True)
每次,无论 QuerySet 中有多少对象。
因为你传递的是QuerySet
,你可以在__init__()
[=中使用count()
[Django doc]方法MachineSerializer
的 21=] 方法重写。
class MachineSerializer(serializers.ModelSerializer):
class Meta:
model = Machine
fields = '__all__'
<b>def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
if kwargs['instance'].count() > 1: # count() method used here <<<<<
kwargs['many'] = True
else:
kwargs['many'] = False</b>
我有以下 机器 型号。
class Machine(models.Model):
operators = models.ManyToManyField(User, related_name='machines', blank=True)
elasticsearch_id = models.PositiveIntegerField(default=None, null=True, blank=True)
company = models.ForeignKey(Company, default=None, null=True, blank=True,on_delete=models.SET_DEFAULT)
machine_brand = models.CharField(max_length=200, null=False)
machine_model = models.CharField(max_length=200, default='')
machine_picture = models.URLField(max_length=200, null=True)
tools = models.ManyToManyField('Tool', default=None, blank=True)
clustered_tags = JSONField(null=True)
elasticsearch_tags = JSONField(null=True, blank=True, default=DEFAULT_TAG_MAP)
machine_slug = models.SlugField()
使用以下序列化器。
class MachineSerializer(serializers.ModelSerializer):
class Meta:
model = Machine
fields = '__all__'
在我看来,我正在过滤登录用户所属公司的数据。现在,我想序列化对象并将其 return 发送给客户端。但是,我事先不知道查询集是对象列表还是单个对象,因此我可以将序列化程序的 many 标志设置为 true 或 false.
@api_view(['GET','POST'])
def manage_operators(request):
user_machines = Machine.objects.filter(company=request.user.company)
user_machines_ser = MachineSerializer(user_machines, many=True)
return Response({'machines': user_machines_ser.data})
有什么优雅的方法可以解决这个问题吗?我可以这样解决,但必须有更好的方法。
if len(user_machines) > 0 :
user_machine_ser = MachineSerializer(user_machines, many=True)
else:
user_machine_ser = MachineSerializer(user_machines, many=False)
非常感谢任何意见!
由于每次都获取一个QuerySet,如果QuerySet中只有一项,则不必设置many=False
。
所以你可以放心使用
user_machine_ser = MachineSerializer(user_machines, many=True)
每次,无论 QuerySet 中有多少对象。
因为你传递的是QuerySet
,你可以在__init__()
[=中使用count()
[Django doc]方法MachineSerializer
的 21=] 方法重写。
class MachineSerializer(serializers.ModelSerializer):
class Meta:
model = Machine
fields = '__all__'
<b>def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
if kwargs['instance'].count() > 1: # count() method used here <<<<<
kwargs['many'] = True
else:
kwargs['many'] = False</b>