【问题标题】:How to create nested serialization from mutliple models uisng django rest framewrok如何使用 django rest 框架从多个模型创建嵌套序列化
【发布时间】:2022-06-14 08:59:19
【问题描述】:

我正在尝试从 Django Rest Framework 中的两个以上模型创建嵌套关系。 预先感谢您帮助我。 我成功使用了两个模型,但是当我尝试使用三个模型时无法创建嵌套序列化。


from django.db import models

class Project(models.Model):
  project_id = models.AutoField(primary_key=True)
  project_name = models.CharField(max_length=255)
  
  def __str__(self):
    return self.name

class Site(models.Model):
  site_id =  models.AutoField(primary_key=True)
  site_name = models.CharField(max_length=255)
  project_id= models.ForeignKey(Project, related_name="projectid", on_delete=models.CASCADE)
  
  def __str__(self):
    return self.site_name 
class Aggin(models.Model):
   assign_id = models.AutoField(primary_key=True)
   site_id = Models.ForeginKey(Site, relate_name="siteid", on_delete=models.CASCADE)
  
from rest_framework import serializers
from .models import Song, Artist


class ProjectSerializer(serializers.ModelSerializer):
    class Meta:
      model = Project
      fields = ('__all__')
      
class SiteSerializer(serializers.ModelSerializer):
  
   
  class Meta:
    model = Site
    fields = ('__all__')

class AggignSerializer(serializers.ModelSerializer)
  class Meta:
     model = Aggin
     fields = ('__all__')

【问题讨论】:

  • 会发生什么,您预计会发生什么?
  • 你在课堂Aggin这里有错字:site_id = Models.ForeginKey

标签: python django django-rest-framework


【解决方案1】:

如果你想使用 Django 的默认外键设置,我认为你不需要主 id 字段。而related_name应该从对应模型的角度来定义。

from django.db import models

class Project(models.Model):
  project_name = models.CharField(max_length=255)
  
  def __str__(self):
    return self.name

class Site(models.Model):
  site_name = models.CharField(max_length=255)
  project = models.ForeignKey(Project, related_name="sites", on_delete=models.CASCADE)
  
  def __str__(self):
    return self.site_name 

class Aggin(models.Model):
   site = Models.ForeginKey(Site, relate_name="assigns", on_delete=models.CASCADE)

然后,在序列化程序中,您可以设置如下。

from rest_framework import serializers
from .models import Song, Artist

class ProjectSerializer(serializers.ModelSerializer):
    sites = SiteSerializer(read_only = True, many = True)

    class Meta:
      model = Project
      fields = ('id', 'project_name', 'sites')
      
class SiteSerializer(serializers.ModelSerializer):
    assigns = AggignSerializer(read_only = True, many = True)
   
    class Meta:
        model = Site
        fields = ('id', 'site_name', 'assigns')

class AggignSerializer(serializers.ModelSerializer):

    class Meta:
        model = Aggin
        fields = ('id')

【讨论】:

  • 谢谢,其实我想从三个模型项目名称,站点名称,分配给用户创建三个字段。
  • 预期发布 {"project_name":"test", "site_name":"site test":"assign_id":1}
  • 您的意思是,您想从该 JSON 数据中创建三个对象?
  • 你传递 JSON 数据的权利
  • 然后你可以创建一些自定义的 api 视图来处理那个 JSON。
猜你喜欢
  • 2014-07-26
  • 2013-05-05
  • 2020-04-11
  • 2020-07-07
  • 2021-06-23
  • 1970-01-01
  • 2018-12-13
  • 2017-11-15
  • 2016-05-04
相关资源
最近更新 更多