Tengo este modelo en una aplicación 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 }y esta función en las vistas.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)y finalmente esta parte del código en mi archivo javascript
document.addEventListener('DOMContentLoaded', function() { fetch('/all_comments') .then(response => response.json()) .then(all_comments => { do somethings with the data...y cuando ejecuto esto me sale el error:
TypeError: el objeto de tipo ImageFieldFile no es JSON serializable
Si elimino la línea
"foto": self.photo
desde la función de serialización dentro del modo, todo va bien y obtengo los datos que necesito. ¿Cómo puedo recuperar la URL de las imágenes, también con JsonResponse, para mostrarla con los otros datos? He intentado muchas cosas que encontré aquí y allá, pero no puedo encontrar ninguna solución. Muchas gracias de antemano
Agregar .url después de la foto le dará la URL de la foto como una cadena, agregue así:
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 }prueba esto
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") }o
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 } Tenga en cuenta que es importante agregar upload_to a FileField or ImageField . No olvide ejecutar migraciones y migrar.