DRF 反向查找获取单个项目的简单方法,而不是 1:1 关系的列表?

DRF easy method for reverse lookup to get a single item, not a list for 1:1 relations?

在我的 Django 应用程序中,我使用 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”,我会得到一个包含一个驱动程序对象的列表,其中所有值都为空。

所以我现在使用 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 期望你可以为一个 driver 添加另一辆或很多车,但是,如果你做到了 OneToOneField 那么 driver 不能有超过一辆车,因此在OneToOneField 情况下它应该 return 单个字段而不是列表,如果您尝试添加 many=True 它会引发错误。