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
, то это вызовет ошибку.