如何根据输入是列表还是单个项目自动设置 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 标志设置为 truefalse.

@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>