【问题标题】:How to join two models in django-rest-framework如何在 django-rest-framework 中加入两个模型
【发布时间】:2017-04-04 04:01:36
【问题描述】:

假设我有两个模型:

level:

id
file_number
status


level_process:

process_ptr_id
level_id

我想将上面的两个表格结合起来,使用 django-rest-framework 在一个 API 中显示它。我正在互联网上寻找示例,但我找不到它……顺便说一句使用python 2.7 , django 1.10.5 and djangorestframework 3.6.2

serializer.py

class LevelSerializer(serializers.HyperlinkedModelSerializer):
    id = serializers.ReadOnlyField()
    class Meta:
        model = Level
        fields = ('__all__')

class LevelProcessSerializer(serializers.ModelSerializer):
    level = LevelSerializer(read_only=True)

    class Meta:
        model = LevelProcess
        fields = ('__all__')

views.py

class ViewLevelProcessViewSet(viewsets.ModelViewSet):
    processes = LevelProcess.objects.all()
    serializer_class = LevelProcessSerializer(processes, many=True)

【问题讨论】:

    标签: django django-rest-framework


    【解决方案1】:

    试试下面的。为您的 Level 模型创建序列化程序:

    class LevelSerializer(serializers.ModelSerializer):
        class Meta:
            model = Level
    

    然后,在LevelProcessSerializer 中,像这样包含LevelSerializer

    class LevelProcessSerializer(serializers.ModelSerializer):
        level = LevelSerializer(read_only=True)
    
        class Meta:
            model = LevelProcess
    

    在您的模型视图集中使用:

    class ViewLevelProcessViewSet(viewsets.ModelViewSet):
        queryset = LevelProcess.objects.all() 
        serializer_class = LevelProcessSerializer
    

    这样,您的 json 将如下所示:

    {
       "id": 1,
       "level": {
          "id": 3,
          "status": "red"
       }
    }
    

    希望这会有所帮助!

    【讨论】:

    • @uetoaya 这是假设您的LevelProcess 中的LevelProcess 是一个外键。如果没有,请告诉我
    • 是的.. level_idLevelProcess 中的外键
    • myviews?中的查询集怎么样
    • 我尝试了你的代码并得到了这个错误could not automatically determine the name from the viewset, as it does not have a '.queryset' attribute.
    • @uetoaya 查看答案中的用法。我认为你得到的错误是因为别的原因。请粘贴您的代码,我会尽力提供帮助
    【解决方案2】:

    不要尝试“加入”表格。这不是 SQL。

    我假设您的模型如下所示,

    class Level(models.Model):
        .......
    
    class LevelProcess(models.Model):
        level = models.ForeignKey(Level)
    

    现在,让我们来查询吧,

    l = Level.objects.filter(id=level_id).first()
    lp = l.level_process_set.all()
    

    这就是我们在 Django ORM 中的做法。

    【讨论】:

    • 这不会导致对每个相关的LevelProcess进行多次查询吗?那如何更可取?归根结底是 SQL,你不能假装这东西背后没有数据库引擎……
    猜你喜欢
    • 2014-01-09
    • 1970-01-01
    • 2013-11-11
    • 1970-01-01
    • 2013-04-19
    • 2014-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多