简体   繁体   English

如何在Django Rest Framework中列出相关对象

[英]How to list related objects in Django Rest Framework

I am trying to add a new field in a model serializer which will show all the related values of this model to another. 我试图在模型序列化器中添加一个新字段,该字段将向另一个模型显示该模型的所有相关值。

Like as I have following : 就像我有以下内容一样:

models.py models.py

from django.db import models

class University(models.Model):
    name = models.CharField(max_length=50)

    def __unicode__(self):
        return self.name

class Student(models.Model):
    first_name = models.CharField(max_length=50)
    last_name = models.CharField(max_length=50)
    university = models.ForeignKey(University)

    def __unicode__(self):
        return '%s %s' % (self.first_name, self.last_name)

views.py views.py

from rest_framework import viewsets
from .models import University, Student
from .serializers import UniversitySerializer, StudentSerializer

class StudentViewSet(viewsets.ModelViewSet):
    queryset = Student.objects.all()
    serializer_class = StudentSerializer

class UniversityViewSet(viewsets.ModelViewSet):
    queryset = University.objects.all()
    serializer_class = UniversitySerializer

serializers.py serializers.py

from rest_framework import serializers
from .models import University, Student

class UniversitySerializer(serializers.ModelSerializer):
    class Meta:
        model = University

class StudentSerializer(serializers.ModelSerializer):
    class Meta:
        model = Student

and

urls.py urls.py

from rest_framework import routers
from core.views import StudentViewSet, UniversityViewSet
from django.conf import settings
from django.conf.urls import url, include
from django.contrib import admin

router = routers.DefaultRouter()
router.register(r'students', StudentViewSet)
router.register(r'universities', UniversityViewSet)

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^api/', include('apps.core.urls', namespace='core')),
]

and now i am writing rest-api using django-rest-framework so i get like this 现在我正在使用django-rest-framework编写rest-api,所以我得到这样的

HTTP 200 OK
Allow: GET, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept

{
    "students": "http://127.0.0.1:8000/api/students/",
    "universities": "http://127.0.0.1:8000/api/universities/"
}

now when i click http://127.0.0.1:8000/api/universities/ . 现在,当我单击http://127.0.0.1:8000/api/universities/时 I get 我懂了

HTTP 200 OK
Allow: GET, POST, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept

[
    {
        "id": 1,
        "name": "test42"
    },
    {
        "id": 2,
        "name": "xxxxxx1222"
    },
    {
        "id": 3,
        "name": "MIT"
    }
] 

and this on clicking http://127.0.0.1:8000/api/students/ 然后点击http://127.0.0.1:8000/api/students/

HTTP 200 OK
Allow: GET, POST, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept

[
    {
        "id": 35,
        "first_name": "Gugu",
        "last_name": "Gaga",
        "university": 11
    },
    {
        "id": 36,
        "first_name": "qwer",
        "last_name": "abcd",
        "university": 12
    }
]

So as student has a particular university no so i want to add a list of ids of students in a university. 因此,由于学生有一所特定的大学,所以我想添加一所大学的学生ID列表。 Like 喜欢

HTTP 200 OK
Allow: GET, POST, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept

[
    {
        "id": 1,
        "name": "test42"
        "students" : {42,56,78}
    },
    {
        "id": 2,
        "name": "xxxxxx1222"
        "students" : {2,6,8}
    },
    {
        "id": 3,
        "name": "MIT"
        "students" : {4,5,7}
    }
] 

How to do that? 怎么做?

You can make use of PrimaryKeyRelatedField for this. 您可以为此使用PrimaryKeyRelatedField First set related_name attribute to your foreign key. 首先将related_name属性设置为您的外键。

university = models.ForeignKey(University, related_name='students')

And then change your serializer like this. 然后像这样更改序列化器。

class UniversitySerializer(serializers.ModelSerializer):
    students = serializers.PrimaryKeyRelatedField(many=True, read_only=True)
    class Meta:
        model = University

Hope this helps :) 希望这可以帮助 :)

You can also use the related_name attribute like this (don't forget to makemigrations -> migrate ): 您也可以使用related_name这样的属性(不要忘记makemigrations - > migrate ):

class Student(models.Model):
    first_name = models.CharField(max_length=50)
    last_name = models.CharField(max_length=50)
    university = models.ForeignKey(University, related_name="students")

Now when accessed in the UniversitySerializer you can just add the new field name: 现在,在UniversitySerializer中访问后,您只需添加新的字段名称即可:

class UniversitySerializer(serializers.ModelSerializer):
    class Meta:
        model = University
        fields = ("id", "name", "students",)

That will return you exactly what you are asking for, now just to add if you have small data sets and always require to fetch the related data, you can serialize it at the UniversitySerializer level directly (instead of having to make different calls) something like this: 这将完全返回您的要求,现在只是添加如果您的数据集很小,并且始终需要获取相关数据,则可以直接在UniversitySerializer级别上对其进行序列化(而不必进行不同的调用),例如这个:

class UniversitySerializer(serializers.ModelSerializer):
    students = StudentSerializer(many=True, read_only=True)
    class Meta:
        model = University
        fields = ("id", "name", "students",)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 如何获取 Django-rest-Framework 中相关对象的完整列表 - How to get complete list of related objects in Django-rest-Framework Django Rest Framework - 获取列表中的完整相关对象 - Django Rest Framework - Get full related objects in list 更新相关对象 django rest 框架 - Updating related objects django rest framework Django Rest Framework在运行验证后将相关对象列表转换为空白列表 - Django Rest Framework converting list of related objects into blank list after running validations Django + Django Rest 框架:在中间 Z20F35E630DAF3494DBFA4C3F6DF8C 上获取正确的相关对象 - Django + Django Rest Framework: get correct related objects on intermediate model 如何在django rest框架中反序列化多个对象的列表? - How do I deserialize list of multiple objects in django rest framework? 如何使用Django REST Framework返回模型对象的自定义列表? - How to return a custom list of Model objects using Django REST Framework? 如何在 django rest 框架中列出来自特定 model 的所有对象? - How to list all objects from particular model in django rest framework? 如何自定义相关结果Django Rest Framework - How to custom related result Django Rest Framework Django REST Framework:反序列化对象列表 - Django REST Framework: deserializing a list of objects
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM