Как автоматически установить флаг «многие» в сериализаторе django в зависимости от того, является ли вход списком или отдельным элементом - PullRequest
0 голосов
/ 11 сентября 2018

У меня есть следующая модель машины.

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__'

С моей точки зрения, я фильтрую данные о компании, к которой принадлежит зарегистрированный пользователь.Теперь я хочу сериализовать объект и вернуть его клиенту.Однако я не знаю заранее, является ли набор запросов списком объектов или отдельным объектом, чтобы я мог установить флаг 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})

Есть ли какой-нибудь элегантный способ решить эту проблему?Я мог бы решить это таким образом, но должен быть лучший способ сделать это.

Ответы [ 2 ]

0 голосов
/ 11 сентября 2018

Поскольку вы передаете QuerySet, вы можете использовать метод count() [Django doc] в __init__() метод MachineSerializer путем его переопределения.

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>
0 голосов
/ 11 сентября 2018

Поскольку вы каждый раз выбираете QuerySet, вам не нужно устанавливать many=False, если в QuerySet есть только один элемент.
Так что вы можете безопасно использовать

user_machine_ser = MachineSerializer(user_machines, many=True)

каждый раз, независимо от того, сколько объектов в QuerySet.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...