Django - Загрузка чужих изображений с помощью API
Здравствуйте, я разрабатываю проект блога на django. К каждому посту прикреплены изображения. Я хочу поделиться проектом с друзьями (путем клонирования ими репозитория github), но не хочу, чтобы они скачивали все изображения.
Итак, я сделал новое приложение на моем проекте, API с django-rest-фреймворком, который позволяет им получить список изображений из моего проекта. Как только кто-то получает список, он создает новые экземпляры Post и ImagePost в БД, основываясь на json-значении
Они получают новый экземпляр в своей БД, но не получают изображения, а только путь к файлу
Я понятия не имею, как передать им изображения, используя 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"]
NB: Убедитесь, что 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)
Удачный друг