REST API Django 不显示不同端点中的所有表
REST API Django does not show all tables in different endpoints
我正在学习 REST API Django,感谢您的耐心等待并帮助理解以下案例。
在myproject/abcapp/forms.py
from django import forms
from .models import *
class ProfileForm(forms.ModelForm):
class Meta:
model=Profile
fields = "__all__"
class Zoo_data_2020Form(forms.ModelForm):
class Meta:
model=Zoo_data_2020
fields = "__all__"
在myproject/abcapp/models.py
from django.conf import settings
from django.db import models
class ProfileQuerySet(models.QuerySet):
pass
class ProfileManager(models.Manager):
def get_queryset(self):
return ProfileQuerySet(self.model,using=self._db)
class Profile(models.Model):
name=models.CharField(settings.AUTH_USER_MODEL,max_length=200)
subtype=models.CharField(max_length=500)
type=models.CharField(max_length=500)
gender=models.CharField(max_length=500)
objects = ProfileManager()
class Meta:
verbose_name = 'Profile'
verbose_name_plural = 'Profiles'
managed = False
db_table ='profiles'
def __str__(self):
return '{}'.format(self.name)
class Zoo_data_2020QuerySet(models.QuerySet):
pass
class Zoo_data_2020Manager(models.Manager):
def get_queryset(self):
return Zoo_data_2020QuerySet(self.model,using=self._db)
class Zoo_data_2020(models.Model):
name=models.CharField(max_length=200)
size=models.DecimalField(decimal_places=3,max_digits=100000000)
weight=models.DecimalField(decimal_places=3,max_digits=100000000)
age=models.DecimalField(decimal_places=3,max_digits=100000000)
objects = Zoo_data_2020Manager()
class Meta:
verbose_name = 'zoo_data_2020'
verbose_name_plural = 'zoo_data_2020s'
managed = False
db_table ='zoo_data_2020'
def __str__(self):
return '{}'.format(self.name)
在myproject/abcapp/api/views.py
中:
from rest_framework import generics, mixins, permissions
from rest_framework.views import APIView
from rest_framework.response import Response
import json
from django.shortcuts import get_object_or_404
from abcapp.models import *
from .serializers import *
def is_json(json_data):
try:
real_json = json.loads(json_data)
is_valid = True
except ValueError:
is_valid = False
return is_valid
class ProfileDetailAPIView(generics.RetrieveAPIView):
permission_classes = []
authentication_classes = []
queryset= Profile.objects.all()
serializer_class = ProfileSerializer
lookup_field = 'id'
class ProfileAPIView(generics.ListAPIView):
permission_classes = []
authentication_classes= []
serializer_class = ProfileSerializer
passed_id = None
search_fields = ('id','name','animal')
queryset = Profile.objects.all()
def get_queryset(self):
qs = Profile.objects.all()
query = self.request.GET.get('q')
if query is not None:
qs=qs.filter(name__icontains=query)
return qs
class Zoo_data_2020DetailAPIView(generics.RetrieveAPIView):
permission_classes = []
authentication_classes = []
queryset= Zoo_data_2020.objects.all()
serializer_class = Zoo_data_2020Serializer
lookup_field = ('id','name')
class Zoo_data_2020APIView(generics.ListAPIView):
permission_classes =[]
authentication_classes= []
serializer_class = Zoo_data_2020Serializer
passed_id = None
search_fields = ('id','name')
queryset = Zoo_data_2020.objects.all()
def get_queryset(self):
qs = Zoo_data_2020.objects.all()
query = self.request.GET.get('q')
if query is not None:
qs=qs.filter(name__icontains=query)
return qs
在myproject/abcapp/api/serializers.py
中:
from rest_framework import serializers
from abcapp.models import *
class ProfileSerializer(serializers.ModelSerializer):
class Meta:
model=Profile
fields = "__all__"
read_only_fields = ['name']
class Zoo_data_2020Serializer(serializers.ModelSerializer):
class Meta:
model = Zoo_data_2020
fields = "__all__"
read_only_fields = ['name']
在myproject/abcapp/api/urls.py
中:
from django.urls import path
from .views import *
urlpatterns = [
path('', ProfileAPIView.as_view()),
path('<id>/', ProfileDetailAPIView.as_view()),
path('', Zoo_data_2020APIView.as_view()),
path('<id>/', Zoo_data_2020DetailAPIView.as_view()),]
在myproject/urls.py
中:
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('api/profile/', include('abcapp.api.urls')),
path('api/zoodata2020/', include('abcapp.api.urls')),
]
所以当我调用 http://127.0.0.1:8000/api/profile/
时,我从 table 的配置文件 中获取 数据,但是当我调用 http://127.0.0.1:8000/api/zoodata2020/
时,我得到 数据再次来自 table 配置文件而不是 Zoo_data_2020。但是当我从 myproject/abcapp/api/urls.py
中删除时:
path('', ProfileAPIView.as_view()),
path('<id>/', ProfileDetailAPIView.as_view()),
然后它向我显示来自 table Zoo_data_2020
的数据,但是我无法从 table 个人资料
中获取数据
如何解决?我确定我在应用程序和项目中的 urls.py 中都做错了。那么我需要做些什么才能使端点分开?以及如何同时显示它们?
我想调用 http://127.0.0.1:8000/api/profile/?search=TIGER and as result to give me information from both tables profiles and zoo_data_2020 as they contain different data but about the same 'name' which is TIGER. But currently when for example i call http://127.0.0.1:8000/api/profile/?search=TIGER 它只显示来自表格 Profile
的数据而不是来自 Zoo_data_2020
请帮助理解它以及如何修复它。提前致谢。
在项目 urls.py 中,您不必多次引用同一个应用程序,您可以在应用程序的 urls.py
中执行此操作
试试这个
myproject/urls.py:
urlpatterns = [
path('admin/', admin.site.urls),
path('api/', include('cfs.api.urls')),
]
myproject/abcapp/api/urls.py:
urlpatterns = [
path('profile', ProfileAPIView.as_view()),
path('profile/<id>/', ProfileDetailAPIView.as_view()),
path('zoo_data', Zoo_data_2020APIView.as_view()),
path('zoo_data/<id>/', Zoo_data_2020DetailAPIView.as_view()),
]
我正在学习 REST API Django,感谢您的耐心等待并帮助理解以下案例。
在myproject/abcapp/forms.py
from django import forms
from .models import *
class ProfileForm(forms.ModelForm):
class Meta:
model=Profile
fields = "__all__"
class Zoo_data_2020Form(forms.ModelForm):
class Meta:
model=Zoo_data_2020
fields = "__all__"
在myproject/abcapp/models.py
from django.conf import settings
from django.db import models
class ProfileQuerySet(models.QuerySet):
pass
class ProfileManager(models.Manager):
def get_queryset(self):
return ProfileQuerySet(self.model,using=self._db)
class Profile(models.Model):
name=models.CharField(settings.AUTH_USER_MODEL,max_length=200)
subtype=models.CharField(max_length=500)
type=models.CharField(max_length=500)
gender=models.CharField(max_length=500)
objects = ProfileManager()
class Meta:
verbose_name = 'Profile'
verbose_name_plural = 'Profiles'
managed = False
db_table ='profiles'
def __str__(self):
return '{}'.format(self.name)
class Zoo_data_2020QuerySet(models.QuerySet):
pass
class Zoo_data_2020Manager(models.Manager):
def get_queryset(self):
return Zoo_data_2020QuerySet(self.model,using=self._db)
class Zoo_data_2020(models.Model):
name=models.CharField(max_length=200)
size=models.DecimalField(decimal_places=3,max_digits=100000000)
weight=models.DecimalField(decimal_places=3,max_digits=100000000)
age=models.DecimalField(decimal_places=3,max_digits=100000000)
objects = Zoo_data_2020Manager()
class Meta:
verbose_name = 'zoo_data_2020'
verbose_name_plural = 'zoo_data_2020s'
managed = False
db_table ='zoo_data_2020'
def __str__(self):
return '{}'.format(self.name)
在myproject/abcapp/api/views.py
中:
from rest_framework import generics, mixins, permissions
from rest_framework.views import APIView
from rest_framework.response import Response
import json
from django.shortcuts import get_object_or_404
from abcapp.models import *
from .serializers import *
def is_json(json_data):
try:
real_json = json.loads(json_data)
is_valid = True
except ValueError:
is_valid = False
return is_valid
class ProfileDetailAPIView(generics.RetrieveAPIView):
permission_classes = []
authentication_classes = []
queryset= Profile.objects.all()
serializer_class = ProfileSerializer
lookup_field = 'id'
class ProfileAPIView(generics.ListAPIView):
permission_classes = []
authentication_classes= []
serializer_class = ProfileSerializer
passed_id = None
search_fields = ('id','name','animal')
queryset = Profile.objects.all()
def get_queryset(self):
qs = Profile.objects.all()
query = self.request.GET.get('q')
if query is not None:
qs=qs.filter(name__icontains=query)
return qs
class Zoo_data_2020DetailAPIView(generics.RetrieveAPIView):
permission_classes = []
authentication_classes = []
queryset= Zoo_data_2020.objects.all()
serializer_class = Zoo_data_2020Serializer
lookup_field = ('id','name')
class Zoo_data_2020APIView(generics.ListAPIView):
permission_classes =[]
authentication_classes= []
serializer_class = Zoo_data_2020Serializer
passed_id = None
search_fields = ('id','name')
queryset = Zoo_data_2020.objects.all()
def get_queryset(self):
qs = Zoo_data_2020.objects.all()
query = self.request.GET.get('q')
if query is not None:
qs=qs.filter(name__icontains=query)
return qs
在myproject/abcapp/api/serializers.py
中:
from rest_framework import serializers
from abcapp.models import *
class ProfileSerializer(serializers.ModelSerializer):
class Meta:
model=Profile
fields = "__all__"
read_only_fields = ['name']
class Zoo_data_2020Serializer(serializers.ModelSerializer):
class Meta:
model = Zoo_data_2020
fields = "__all__"
read_only_fields = ['name']
在myproject/abcapp/api/urls.py
中:
from django.urls import path
from .views import *
urlpatterns = [
path('', ProfileAPIView.as_view()),
path('<id>/', ProfileDetailAPIView.as_view()),
path('', Zoo_data_2020APIView.as_view()),
path('<id>/', Zoo_data_2020DetailAPIView.as_view()),]
在myproject/urls.py
中:
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('api/profile/', include('abcapp.api.urls')),
path('api/zoodata2020/', include('abcapp.api.urls')),
]
所以当我调用 http://127.0.0.1:8000/api/profile/
时,我从 table 的配置文件 中获取 数据,但是当我调用 http://127.0.0.1:8000/api/zoodata2020/
时,我得到 数据再次来自 table 配置文件而不是 Zoo_data_2020。但是当我从 myproject/abcapp/api/urls.py
中删除时:
path('', ProfileAPIView.as_view()),
path('<id>/', ProfileDetailAPIView.as_view()),
然后它向我显示来自 table Zoo_data_2020
的数据,但是我无法从 table 个人资料
如何解决?我确定我在应用程序和项目中的 urls.py 中都做错了。那么我需要做些什么才能使端点分开?以及如何同时显示它们?
我想调用 http://127.0.0.1:8000/api/profile/?search=TIGER and as result to give me information from both tables profiles and zoo_data_2020 as they contain different data but about the same 'name' which is TIGER. But currently when for example i call http://127.0.0.1:8000/api/profile/?search=TIGER 它只显示来自表格 Profile
的数据而不是来自 Zoo_data_2020
请帮助理解它以及如何修复它。提前致谢。
在项目 urls.py 中,您不必多次引用同一个应用程序,您可以在应用程序的 urls.py
中执行此操作试试这个
myproject/urls.py:
urlpatterns = [
path('admin/', admin.site.urls),
path('api/', include('cfs.api.urls')),
]
myproject/abcapp/api/urls.py:
urlpatterns = [
path('profile', ProfileAPIView.as_view()),
path('profile/<id>/', ProfileDetailAPIView.as_view()),
path('zoo_data', Zoo_data_2020APIView.as_view()),
path('zoo_data/<id>/', Zoo_data_2020DetailAPIView.as_view()),
]