【问题标题】:Creating an API using Django-Rest-Framework with join tables使用带有连接表的 Django-Rest-Framework 创建 API
【发布时间】:2017-06-12 12:41:59
【问题描述】:

我有以下 MySQL 表:
-制作
-型号
-风格

models.py(自动生成)

class Makes(models.Model):
  id = models.IntegerField(primary_key=True)
  name = models.CharField(max_length=13)
  nicename = models.CharField(db_column='niceName', max_length=13)
  class Meta:
      managed = False
      db_table = 'Makes'


class Models(models.Model):
    id = models.CharField(primary_key=True, max_length=36)
    name = models.CharField(max_length=23)
    nicename = models.CharField(db_column='niceName', max_length=23)
    make =  models.ForeignKey(Makes, models.DO_NOTHING)
    class Meta:
      managed = False
      db_table = 'Models'

序列化器.py

class MakeSerializer(serializers.ModelSerializer):


  class Meta:
    model = Makes
    fields = ('name',)


class ModelSerializer(serializers.ModelSerializer):


make = MakeSerializer(many=True, read_only=True)

class Meta:
    model = Models
    fields = ('make','id', 'name', 'nicename')

views.py

class MakesList(generics.ListCreateAPIView):
     queryset = Makes.objects.all()
     serializer_class = MakeSerializer

class MakesDetail(generics.RetrieveUpdateDestroyAPIView):
     queryset = Makes.objects.all()
     serializer_class = MakeSerializer

换句话说,Styles 是父表,其中包含用于连接两者的 Make 和 Model 的 ID。

我如何与 DRF 建立关系以获得预期的输出:

    "makes": [{
    "id": 1,
    "name": "Acura",
    "models": [{
        "id": "Acura_ILX",
        "name": "ILX",
        "styles": [{
                  "id": "1"
                  "name": "Sport"
                  }]
    }, {
        "id": "Acura_ILX_Hybrid",
        "name": "ILX Hybrid",
        "styles": [{
                  "id": "1"
                  "name": "Sport"
                  }]
    }, {
        "id": "Acura_MDX",
        "name": "MDX",
        "styles": [{
                  "id": "1"
                  "name": "Sport"
                  }]
        }]

【问题讨论】:

    标签: mysql json django api django-rest-framework


    【解决方案1】:

    所以基本上你要做的就是创建一堆序列化器。

    class MakeSerializer(serializers.ModelSerializer):
        class Meta:
            model = Make
            fields = ('your', 'fields', 'here')
    
    class ModelSerializer(serializers.ModelSerializer):
        make = MakeSerializer(many=True, read_only=True)
    
        class Meta:
            model = Model
            fields = ('name', 'just_fields_here')
    
    class StyleSerializer(serializers.ModelSerializer):
        model = ModelSerializer(many=True, read_only=True)
    
        class Meta:
            model = Style
            fields = ('your_fields_here_again', )
    

    这就是您的序列化程序最简单的样子。

    你可以这样使用它:

    >>> make = Make.objects.create(name="Audi")
    >>> model1 = Model.objects.create(make=make, name='R8')
    >>> model2 = Model.objects.create(make=make, name='Q7')
    >>> Style.objects.create(model=model1, name='Sport')
    >>> Style.objects.create(model=model2, name='SUV')
    
    >>> serializer = MakeSerializer(instance=make)
    

    并通过使用

    >>> serializer.data
    

    你的输出应该是这样的:

    {
        'name': 'Audi',
        'model': [{
            'name': 'R8',
            'style': {
                'name': 'Sport'
            }
        },{
            'name': 'Q7',
            'style': {
                'name': 'SUV'
            }
        }]
    }
    

    【讨论】:

    • 这只是一个例子。如果您填充了数据,只需创建这些序列化程序。下载一个您感兴趣的对象,并将其作为实例传递给序列化器
    猜你喜欢
    • 1970-01-01
    • 2014-02-14
    • 1970-01-01
    • 2016-12-23
    • 1970-01-01
    • 2015-08-02
    • 2019-04-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多