Как получить url изображения из поля ImageField в модели Django с помощью JsonResponse?

У меня есть эта модель в приложении Django

class Comment(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    say = models.CharField(max_length=250)
    date = models.DateTimeField(auto_now_add=True)
    photo =  models.ImageField(null = True, blank = True)
    
    def serialize(self):
        return {
            "user": self.user.username,
            "say": self.say,
            "date": self.date.strftime("%a-%d-%b-%Y , %H:%M:%S %p"),
            "photo": self.photo
        }

и эта функция в файле views.py

@login_required(login_url = 'login')#redirect when user is not logged in
def all_comments(request):
    all_comments = Comment.objects.order_by("-date").all()
    return JsonResponse([comment.serialize() for comment in all_comments], safe=False)

и, наконец, вот эта часть кода в моем файле javascript

document.addEventListener('DOMContentLoaded', function() {
    fetch('/all_comments') 
  .then(response => response.json())
  .then(all_comments => {
do somethings with the data...

и когда я запускаю это, я получаю ошибку:

TypeError: Объект типа ImageFieldFile не является JSON сериализуемым

Если я удалю строку

"фото": self.photo

из функции serialize внутри режима все идет нормально, и я получаю данные, которые мне нужны. Как я могу получить url изображения, а также JsonResponse, чтобы отобразить его вместе с другими данными? Я перепробовал много вещей, которые нашел здесь и там, но не могу найти никакого решения. Заранее большое спасибо

Добавление .url после фотографии даст вам URL фотографии в виде строки, добавьте так:

class Comment(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    say = models.CharField(max_length=250)
    date = models.DateTimeField(auto_now_add=True)
    photo =  models.ImageField(null = True, blank = True)
    
    def serialize(self):
        return {
            "user": self.user.username,
            "say": self.say,
            "date": self.date.strftime("%a-%d-%b-%Y , %H:%M:%S %p"),
            "photo": self.photo.url
        }

попробуйте это

class Comment(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    say = models.CharField(max_length=250)
    date = models.DateTimeField(auto_now_add=True)
    photo =  models.ImageField(upload_to='myphotos',null = True, blank = True)
    
    def serialize(self):
        if self.photo:
            return {
            "user": self.user.username,
            "say": self.say,
            "date": self.date.strftime("%a-%d-%b-%Y , %H:%M:%S %p"),
            "photo": self.photo.url
        }
        return {
            "user": self.user.username,
            "say": self.say,
            "date": self.date.strftime("%a-%d-%b-%Y , %H:%M:%S %p")
        }

или

class Comment(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    say = models.CharField(max_length=250)
    date = models.DateTimeField(auto_now_add=True)
    photo =  models.ImageField(upload_to='myphotos',null = True, blank = True)
    
    def serialize(self):
        return {
            "user": self.user.username,
            "say": self.say,
            "date": self.date.strftime("%a-%d-%b-%Y , %H:%M:%S %p"),
            "photo": self.photo.url if self.photo else None
        } 

Обратите внимание, что важно добавить upload_to к FileField or ImageField.Не забудьте запустить миграции migrate.

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