如何在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,你不能假装这背后没有数据库引擎。。。