gpt4 book ai didi

python - 具有反向关系的 Django rest 框架序列化程序

转载 作者:行者123 更新时间:2023-11-28 20:59:33 25 4
gpt4 key购买 nike

我有两个模型,其中 employeeperson 模型有关系,但 personemployee 模型没有关系.

喜欢:

class Person(models.Model):
name = models.CharField(max_length=100)
address = models.CharField(max_length=100)

class Employee(models.Model):
person = models.ForeignKey(Person, related_name='person_info')
code = models.CharField()

在这种情况下,我希望在 person 序列化器中使用 code 字段数据。


我可以通过在 person 模型中编写方法或在 person 序列化器中使用 SerializerMethodField 来解决这个问题

像这样:

def get_employee_code(self):
return Employee.objects.get(person=self).id

并将其添加为个人序列化器中的源

employee_code = serializers.CharField(source='get_employee_code')

或者将员工序列化器添加到人员序列化器中

class PersonSerializer(serializers.ModelSerializer):
employee = EmployeeSerializer()
class Meta:
model = Person
fields = ('name', 'address', 'employee')

但我试图用反向关系来做到这一点,但我做不到。我试过这样,它给出了一个错误

序列化器:

class PersonSerializer(serializers.ModelSerializer):
employee_code = serializers.CharField(source='person_info.code')
class Meta:
model = Person
fields = ('name', 'address', 'employee_code')

如何用反向关系解决这个问题?

最佳答案

目前因为你在 person 属性上使用 ForeignKey 字段,这意味着当你访问反向关系时它返回一个列表。

一个解决方案是使用 slug 相关字段,尽管这必须将 manyread_only 设置为 True,并且由于 ForeignKey 字段将返回一个列表。

class PersonSerializer(serializers.ModelSerializer):
employee_code = serializers.SlugRelatedField(
source='person_info',
slug_field='code',
many=True,
read_only=True,
)

class Meta:
model = Person
fields = ('name', 'address', 'employee_code')

另一种选择是将您的 ForeignKey 更改为 OneToOneField,这仍然需要将 read_only 设置为 True,但它不会返回列表。

class Person(models.Model):
name = models.CharField(max_length=100)
address = models.CharField(max_length=100)

class Employee(models.Model):
person = models.OneToOneField(Person, related_name='person_info')
code = models.CharField()

class PersonSerializer(serializers.ModelSerializer):
employee_code = serializers.SlugRelatedField(
source='person_info',
slug_field='code',
read_only=True,
)

class Meta:
model = Person
fields = ('name', 'address', 'employee_code')

或者,如果您不想更改 ForeignKey,您可以向模型添加一个 employee_code 属性方法,而不是返回 person_info 中的第一个员工代码关系。

class Person(models.Model):
name = models.CharField(max_length=100)
address = models.CharField(max_length=100)

@property
def employee_code(self):
employees = self.person_info.filter()
if employees.exists():
return employees.first().code
return ''

class Employee(models.Model):
person = models.OneToOneField(Person, related_name='person_info')
code = models.CharField()

class PersonSerializer(serializers.ModelSerializer):
employee_code = serializers.CharField(
read_only=True,
)

class Meta:
model = Person
fields = ('name', 'address', 'employee_code')

关于python - 具有反向关系的 Django rest 框架序列化程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49414976/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com