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)

Удачный друг

Вернуться на верх