Django REST框架和组合模型

时间:2017-03-05 16:59:04

标签: python django django-rest-framework

更新了问题

我能够让它工作并更新下面的代码。但现在我的问题是如何编辑iceinfo中的字段?现在它以IceInfo object而不是可编辑字段的形式返回。我只能修改ice_codeice_maker

旧问题

我正在尝试为我们的数据库构建API。数据库中的信息在多个表之间划分,所有表都与主键具有相同的“Ice-code”。

我一直在尝试将一周的大部分时间用于组合表格,以便我可以从一个网址(api.something.com/ice/)查看冰的列表并从(api.something.com/ice/1)能够看到结合所有表格信息的冰的详细视图。

似乎无论我尝试什么,我都无法合并表格。

这是我到目前为止的草稿。我希望能够最终更新前端的字段。每个表的总行数大约在70-80k之间,它们的列数多于这里的列数,但我只是想做一个粗略的工作草案。

#models.py

class IceInfo(models.Model):

    ice_name = models.TextField(db_column='Ice name', blank=True, null=True)
    updated = models.DateTimeField(db_column='Updated')
    ice_code = models.ForeignKey(IceList, related_name='iceinfo', db_column='Ice-code', on_delete=models.CASCADE, primary_key=True)

    class Meta:
        managed = False
        db_table = 'Ice_Info'


class IceList(models.Model):
    ice_code = models.IntegerField(primary_key=True, db_column='Ice-code', max_length=10)
    ice_maker = models.CharField(db_column='Ice Maker', max_length=255, blank=True, null=True)
    updated = models.DateTimeField(db_column='Updated')
    class Meta:
        managed = False
        db_table = 'Ice_List'

    def __str__(self):
        return self.ice_code

#serializers.py

from rest_framework import serializers
from .models import IceList, IceInfo



class IceInfoSerializer(serializers.ModelSerializer):
    class Meta:
        model = IceInfo
        fields = '__all__'


class IceListSerializer(serializers.ModelSerializer):

    iceinfo = IceInfoSerializer(many=True)

    class Meta:
        model = IceList
        fields = ('ice_code', 'ice_maker', 'iceinfo')

#views.py

from .models import IceInfo, IceList
from .serializers import IceListSerializer
from rest_framework.generics import ListAPIView, RetrieveAPIView, RetrieveUpdateAPIView
from rest_framework.filters import SearchFilter, OrderingFilter


class IceList(ListAPIView):
    queryset = IceList.objects.all()
    serializer_class = IceListSerializer
    filter_backends = [SearchFilter, OrderingFilter]
    search_fields = ['ice_code', 'ice_maker', 'ice_name']

结果

"results": [
        {
        "ice_code": 1,
        "iceinfo": [
        {
            ice_name": "Ice Name 1"
        }
        )
        "ice_maker": "Ice Maker 1"
        },
       {
        "ice_code": 2,
        "iceinfo": [
        {
            ice_name": "Ice Name 2"
        }
        )
        "ice_maker": "Ice Maker 2"

        },

1 个答案:

答案 0 :(得分:0)

假设您的目标是序列化许多IceInfo实例,IceList的目的是什么?或者你在尝试不同的东西? Rest框架将多个对象序列化到列表中没有问题。

您可以通过将查询集传递给序列化程序来实现,并给出关键字many = True。看这里: documentation

结果会是这样的  queryset = IceInfoSerializer(IceInfo.objects.all(), many=True)

关于新问题,您应该可以从查询集中编辑它们。你都尝试了些什么? (你可能最好在新问题上开一个新主题)

此外,您发布的JSON似乎无效,是否可以检查您是否正确复制粘贴它?