DRF простой метод обратного поиска для получения одного элемента, а не списка для отношений 1:1?

В моем Django App я использую сериализатор модели для API, чтобы получить доступ на чтение к объектам в БД. Для одного вызова API мне нужно предоставить данные из разных, но связанных объектов в одном результате.

class Car(models.Model):
    name = models.Charfield()

class Driver(models.Model):
    name = models.Charfield()
    car = ForeignKey(Car, on_delete=models.CASCADE, null=Fals, blank=False)

Проблема у меня в том, что я всегда получаю список вместо одного объекта, если я использую вложенные сериализаторы.

Например

class CarSerializer(serializers.ModelSerializer):
    driver = DriverSerilizer(source='driver_set', many=True, read_only=True)

возвращает список с одним элементом, если есть драйвер. Если я устанавливаю "many=False", я получаю список с одним объектом драйвера, где все значения равны null.

Теперь я использую MethodSerializer для получения первого элемента в списке, но это кажется мне неубедительным решением.

  driver = serializers.SerializerMethodField()

  def get_driver(self, obj):
      driver_list = DriverSerilizer(obj.driver_set.all(), many=True).data
      driver = None
      if len(driver_list) ==1:
          driver = driver_list[1]
      return driver

Так это работает, но нет ли лучшего способа?

Это происходит потому, что вы добавили автомобиль как ForeignKey вместо OneToOneField, Django ожидал, что вы можете добавить еще один или много автомобилей для одного водителя, Однако, если вы сделаете OneToOneField, то у водителя не должно быть более одного автомобиля, Поэтому в OneToOneField случае он должен возвращать одно поле, а не список, и если вы попытаетесь добавить many=True, то это вызовет ошибку.

Вернуться на верх