【问题标题】:'utf-8' codec can't decode byte 0xff in position 0: invalid start byte UnicodeDecodeError“utf-8”编解码器无法解码位置 0 的字节 0xff:无效的起始字节 UnicodeDecodeError
【发布时间】:2021-12-01 06:23:22
【问题描述】:

我正在使用 djangorestFramework,在序列化程序中我有一个图像,当我获取它时告诉我“utf-8”错误:

这是一个模型:

from django.db import models
from .categoria import Categoria


class Productos(models.Model):
    
    
    def productos_directory_path(instance,filename):
        return 'productos/{0}'.format(filename)
    
    id_productos = models.AutoField(primary_key=True)
    id_categoria = models.ForeignKey(Categoria, on_delete=models.CASCADE)
    codigo = models.IntegerField(default=0)
    producto = models.CharField('producto', max_length = 100)
    imagen = models.ImageField(upload_to=productos_directory_path, null=True,blank=True)
    stock = models.IntegerField(default=0)
    precio_compra = models.FloatField(default=0.0)
    precio_venta = models.FloatField(default=0.0)
    venta = models.IntegerField(default=0.0)
    fecha = models.DateTimeField(auto_now_add=True)

    
    def __str__(self):
        return self.producto

它是一个序列化器

from rest_framework import serializers

from backend.models.productos import Productos

from backend.models.categoria import Categoria
from backend.serializers.CategoriaSerializers import Categoriaserializers

class ProductosSerializers(serializers.ModelSerializer):
    #Categorias = Categoriaserializers()
    class Meta:
        model = Productos
        fields = "__all__"

localhost:8000/products 上的这个返回这个:

    [
    {
        "id_productos": 8,
        "codigo": 12,
        "producto": "Carro",
        "imagen": "http://localhost:8000/media/productos/bulgakov-mijail-el-maestro-y-margarita.jpg",
        "stock": 0,
        "precio_compra": 0.0,
        "precio_venta": 0.0,
        "venta": 0,
        "fecha": "2021-10-12T16:02:06.167755Z",
        "id_categoria": 2
    }
]

但除此之外,我需要引入产品类别,我是这样做的:

from rest_framework import serializers

from backend.models.productos import Productos

from backend.models.categoria import Categoria
from backend.serializers.CategoriaSerializers import Categoriaserializers

class ProductosSerializers(serializers.ModelSerializer):
    Categorias = Categoriaserializers()
    class Meta:
        model = Productos
        fields = "__all__"
        #fields =  ["id_productos","codigo","producto","imagen","stock","precio_compra","precio_venta","venta","fecha","Categorias"]
        
    def to_representation(self, obj):
        productos = Productos.objects.get(id_productos=obj.id_productos)
        categorias = Categoria.objects.get(productos=obj.id_productos)
            
        return{
            'id_producto': productos.id_productos,
            "codigo": productos.codigo,
            "producto" : productos.producto ,
            "imagen": str(productos.imagen),
            "stock": productos.stock,
            "precio_compra" : productos.precio_compra,
            "precio_venta": productos.precio_venta,
            "venta": productos.venta,
            "fecha": productos.fecha,
            "Categorias":{
                "id_categoria": categorias.id_categoria,
                "categoria": categorias.categoria,
                "fecha": categorias.fecha
            }
        }

我把这个拿回来了

[
    {
        "id_producto": 8,
        "codigo": 12,
        "producto": "Carro",
        "imagen": "productos/bulgakov-mijail-el-maestro-y-margarita.jpg",
        "stock": 0,
        "precio_compra": 0.0,
        "precio_venta": 0.0,
        "venta": 0,
        "fecha": "2021-10-12T16:02:06.167755Z",
        "Categorias": {
            "id_categoria": 2,
            "categoria": "Componentes",
            "fecha": "2021-10-11T15:50:24.101968Z"
        }
    }
]

如您所见,我得到的图像是 ("products/bulgakov-mijail-the-teacher-and-margarita.jpg ) 由

"imagen": str(products.imagen)

因为如果我删除它,我会收到以下错误消息

我怎样才能像第一个代码sn-p一样获得图像的ulr,并删除str()

提前致谢

【问题讨论】:

  • 在您的第一个示例中,您注释掉了一个嵌套序列化程序Categorias = Categoriaserializers(),这看起来就像您想要的那样,为什么它被注释掉了?
  • @IainShelvington 只是为了使第一个代码更清晰,因为在我用于类别的第二个代码中不推荐使用它:D

标签: django


【解决方案1】:

你没有说imagen 是什么类型,但如果它的ImageField 有一个名为url 的属性,你可以写"imagen": products.imagen.url 而不是"imagen": str(products.imagen)

【讨论】:

  • 如果是图像域
  • 是的,如果您的模型上有ImageField,您可以使用url 属性来获取网址
  • 我是这样理解的:/media/productos/bulgakov-mijail-el-maestro-y-margarita.jpg" :/
  • 上传到服务器时没有得到 localhost:8000/,会不会发生同样的事情?
  • 你明白了,因为你必须将基本 url 添加到该 url django 不会自动为你这样做,因为你可以使用this question的anwser
猜你喜欢
  • 2016-05-13
  • 2017-07-09
  • 1970-01-01
  • 2019-05-07
  • 2018-03-14
  • 1970-01-01
  • 2020-02-06
  • 1970-01-01
相关资源
最近更新 更多