New*_*wtt 4 python django django-rest-framework
我有简化为的 Django 模型:
class Client(models.Model):
name = models.CharField(max_length=255)
def __str__(self):
return self.name
class ClientDetail(models.Model):
client = models.ForeignKey(Client, on_delete=models.CASCADE)
business_format = models.CharField(max_length=255)
def __str__(self):
return "Details for {}".format(self.client.name)
class ClientAssignment(models.Model):
client = models.ForeignKey(Client, on_delete=models.CASCADE)
assignment = models.ForeignKey(Assignment, on_delete=models.CASCADE)
def __str__(self):
return "Assignment: {} for Client: {}".format(self.assignment.name, self.client.name)
class Assignment(models.Model):
name = models.CharField(max_length=255)
def __str__(self):
return self.name
Run Code Online (Sandbox Code Playgroud)
我正在使用django-rest-framework并想创建一个视图,我可以在其中提供client_id和接收包含所有 3 个相关模型的序列化对象。我尝试使用 PrimaryKeyRelatedField 如下,但我不确定我是否正确使用它。
class CompleteClientObject(ModelSerializer):
assignment = PrimaryKeyRelatedField(many=True, queryset=ClientAssignment.objects)
detail = PrimaryKeyRelatedField(many=True, queryset=ClientDetail.objects)
client = PrimaryKeyRelatedField(queryset=Client)
class Meta:
model = Client
fields = ("id", "name", "detail", "assignment",)
Run Code Online (Sandbox Code Playgroud)
如何使用序列化程序实现这一点?
在序列化器字段中,您可以使用source参数来指定模型上的字段。如果您尝试从 Client 模型访问反向关系,您应该使用该MODELNAME_set字段作为您的来源。该字段由 Django 添加到外键的另一端。IE
assignment = PrimaryKeyRelatedField(
source='clientassignment_set',
many=True,
read_only=True,
)
Run Code Online (Sandbox Code Playgroud)
请注意,read_only=True您也不需要指定查询集。
您的另一个选择是related_name在您的外键上指定一个覆盖MODELNAME_set自动生成字段的字段,并将它们设置为“分配”和“详细信息”。