如何在django rest框架中连接两个模型

如何在django rest框架中连接两个模型,django,django-rest-framework,Django,Django Rest Framework,假设我有两个模型: level: id file_number status level_process: process_ptr_id level_id 我想结合上面的两个表,使用django rest框架在一个API中显示它。。我在互联网上寻找这个例子,但我找不到它……我使用的是python 2.7、django 1.10.5和djangorestframework 3.6.2 serializer.py class LevelSerializer(serializers.Hyp

假设我有两个模型:

level:

id
file_number
status


level_process:

process_ptr_id
level_id
我想结合上面的两个表,使用django rest框架在一个API中显示它。。我在互联网上寻找这个例子,但我找不到它……我使用的是
python 2.7、django 1.10.5和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)
不要试图“连接”表。这不是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中的做法。

尝试以下方法。为您的
级别
模型创建序列化程序:

class LevelSerializer(serializers.ModelSerializer):
    class Meta:
        model = Level
然后,在
LevelProcessSerializer
中,包括
LevelSerializer
,如下所示:

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

    class Meta:
        model = LevelProcess
{
   "id": 1,
   "level": {
      "id": 3,
      "status": "red"
   }
}
ModelViewset中的用法:

class ViewLevelProcessViewSet(viewsets.ModelViewSet):
    queryset = LevelProcess.objects.all() 
    serializer_class = LevelProcessSerializer
这样,您的json将如下所示:

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

    class Meta:
        model = LevelProcess
{
   "id": 1,
   "level": {
      "id": 3,
      "status": "red"
   }
}

希望这有帮助

@uetoaya这是假设
LevelProcess
中的
level
是一个外键。如果没有,请告诉我是的
level\u id
LevelProcess
中的外键,那么我的
视图中的queryset呢?
我尝试了你的代码,发现了这个错误
无法从视图集中自动确定名称,因为它没有“.queryset”属性。
@uetoaya请参见答案中的用法。我认为你犯的错误是因为别的原因。请粘贴您的代码,我将尝试帮助您,这不会导致对每个相关流程的多个查询吗?这有什么可取之处?这最终是SQL,你不能假装这背后没有数据库引擎。。。