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
它会引发错误。
在我的 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
它会引发错误。