获取并在 Django 中发布



我是Django rest框架的新手,我习惯于在.net中开发API 我想创建 2 个 API,一个通过 pk id获取与之相关的文章和图像,一个帖子添加文章和照片,我尝试了不同的方法,但无法得到我想要的,如果有人可以帮助或分享一些我可以学习这样的东西的网站,那就太好了, 提前致谢 PS:select_related只给了我文章模型的ID。

这是我的 2 个模型:

from django.db import models

class Article(models.Model):
Heading = models.CharField(max_length=200, null=True)
Article = models.TextField(null=True)
CreatedBy = models.IntegerField(null=True)
CreatedDate = models.DateTimeField(null=True)
IsDeleted = models.BooleanField(default=False)

class ArticleImage(models.Model):
Image = models.ImageField(upload_to='photos/', null=True)
ImageArticle = models.ForeignKey(Article, on_delete=models.CASCADE)

这些是我的序列化程序:

from rest_framework import serializers
from .models import Article, ArticleImage

class ArticleSerializer(serializers.ModelSerializer):
class Meta:
model = Article
fields = ('id', 'Heading', 'Article')

class ArticleImageSerializer(serializers.ModelSerializer):
class Meta:
model = ArticleImage
fields = ('id', 'Image', 'ImageArticle')

这些是我的观点:

from django.shortcuts import render
from django.views import View
from rest_framework import views
from rest_framework import viewsets
from .models import Article, ArticleImage
from .serializers import ArticleSerializer, ArticleImageSerializer
from itertools import chain
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status
from django.http import Http404

class ArticleView(viewsets.ModelViewSet):
queryset = Article.objects.all()
serializer_class = ArticleSerializer

class ArticleImageView(viewsets.ModelViewSet):
queryset = ArticleImage.objects.all()
serializer_class = ArticleImageSerializer

class ArticleWImage(viewsets.ModelViewSet):
queryset = ArticleImage.objects.all().select_related()
serializer_class = ArticleImageSerializer

class ImageWArticle(viewsets.ModelViewSet):
queryset = Article.objects.select_related()
serializer_class = ArticleSerializer

class ArticleList(APIView):
def get(self, request):
article = Article.objects.all()
article_image = ArticleImage.objects.all()
return render(request, {
'article': article,
'articleImage': article_image
})

网址:

from django.urls import path, include
from . import views
from rest_framework import routers
router = routers.DefaultRouter()
router.register('articles', views.ArticleView)
router.register('articleImage', views.ArticleImageView)
router.register('articleWithImage', views.ArticleWImage)
router.register('imageWithArticle', views.ImageWArticle)

urlpatterns = [
path('', include(router.urls)),
path('articleImageGet/', views.ArticleList.as_view())
]

您可以使用与 Drango Rest Framework 捆绑在一起的通用视图。

对于你只需要GET和POST的用例,我认为CreateAPIView[for POST],RetrieveAPIView[for GET]就足够了。

http://www.django-rest-framework.org/api-guide/generic-views/#createapiview

http://www.django-rest-framework.org/api-guide/generic-views/#retrieveapiview

像这样:

path('articles/', views.ArticleListCreateAPIView.as_view())
class ArticleListCreateAPIView(CreateAPIView, RetrieveAPIView):
model = Article
serializer_class = ArticleSerializer

class ArticleSerializer(serializers.ModelSerializer):
images = serializers.SerializerMethodField()
class Meta:
model = Article
fields = ('id', 'Heading', 'Article', 'images')
def get_images(self, article):
images = ArticleImage.objects.filter(article=article)
return ArticleImageSerializer(data=images, many=True).data

class ArticleImageSerializer(serializers.ModelSerializer):
class Meta:
model = ArticleImage
fields = ('id', 'Image', 'ImageArticle')

根据官方的DRF文档(这很好(,您可以尝试这样的事情:

class FooList(APIView):
def get(self, request, format=None):
Foos = Foo.objects.all()
serializer = FooSerializer(Foos, many=True)
return Response(serializer.data)
def post(self, request, format=None):
serializer = FooSerializer(data=request.data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data, status=status.HTTP_201_CREATED)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

然后,您必须将视图集正确注册为 urls.py 中的视图:

urlpatterns = [
url(r'^foos/$', views.FooList.as_view()),
]

您始终可以覆盖视图集的自然功能。了解如何覆盖的最佳方法是通过DRF代码库。

例如一般说"/文章">将提供文章列表,"/articles/pk">将提供该primary_key文章的文章信息。如果你想覆盖它的功能,你可以这样的东西...... 从 django.快捷方式导入get_object_or_404 从 rest_framework.响应导入响应 从 .模型 导入 文章, 文章图像 从 .serializers import ArticleSerializer, ArticleImageSerializer

class ArticleViewSet(viewsets.ViewSet):
"""
A simple ViewSet for listing or retrieving articles.
"""

def retrieve(self, request, pk=None):
queryset = Article.objects.all()
article_instance = get_object_or_404(queryset, pk=pk)
article_serializer = ArticleSerializer(article_instance)
image_instance = ArticleImage.objects.get(ImageArticle=article_instance.id)
return Response({
'article': article_serializer.data, 
'image': image_instance.image
})

如果您想了解更多它的工作原理,请阅读此内容

最新更新