你好,我正在 django 中开发一个博客项目。 每篇文章都附有图像 我想与一些朋友分享我的项目(由他们克隆 github 存储库),但不希望他们下载所有图像。
所以我在我的项目上制作了一个新的应用程序,一个带有 django-rest-framework 的 API,允许他们从我的项目中获取图像列表 一旦有人获得列表,它就会根据 json 值在数据库中创建 Post 和 ImagePost 的新实例
他们在数据库中获取新实例,但他们没有获取图像,他们只获取文件路径
我不知道如何使用 API 向他们提供图像,并使图像进入他们的项目。
谢谢你
所以对于我的模型:
class Post(models.Model):
title = models.CharField(max_length=250)
body = models.TextField()
author = models.ForeignKey(User, related_name='blog_posts', on_delete=models.CASCADE)
images = models.ManyToManyField(ImagePost, related_name='images', blank=True)
class ImagePost(models.Model):
image = models.ImageField(upload_to='blog_posts/', blank=True)
还有我的 API 类:
class PostList(ListAPIView):
queryset = Post.objects.filter(archived=False)
serializer_class = PostSerializer
class ImagePostList(ListAPIView):
queryset = ImagePost.objects.all()
serializer_class = ImagePostSerializer
class ImagePostSerializer(ModelSerializer):
class Meta:
model = ImagePost
fields = ["id", "image" ]
网址:
path('post/list/', views.PostList.as_view(), name='post_list'),
path('imagepost/list/', views.ImagePostList.as_view(), name='imagepost_list'),
我的函数根据 json 值创建实例:
def create_imagepost_from_url_json(request):
current_site = get_current_site(request)
domain = current_site.domain,
url = "http://" + str(domain[0])+"/api/video/list/"
response = requests.get(url)
if response.status_code == 200:
data = response.json()
for obj in data:
ImagePost.objects.create(**obj)
return redirect('index')
我建议您更新
ImagePostSerializer
以包含图像数据本身,而不仅仅是文件路径。在添加以下功能之前,请确保从rest_framework导入序列化的所有导入。
这是您的代码的修改;
from rest_framework import serializers
from .models import ImagePost
class ImagePostSerializer(serializers.ModelSerializer):
image = serializers.ImageField(use_url=True) # This will definitely include the image URL in the response for your friends
class Meta:
model = ImagePost
fields = ["id", "image"]
注意:确保您的项目中安装了 Pillow,如果您仍在本地开发,请在您的项目中添加以下代码
url.py
,以便 Django 轻松为您的静态文件提供服务。
from django.conf.urls.static import static
if settings.DEBUG:
urlpatterns += static(settings.STATIC_URL,
document_root=settings.STATIC_ROOT)
urlpatterns += static(settings.MEDIA_URL,
document_root=settings.MEDIA_ROOT)
祝你好运,朋友