【问题标题】:i have one model which having foreign key with images feild and in that i have multiple images can i get them in single list like this :我有一个模型,它有带图像域的外键,因为我有多个图像,我可以像这样将它们放在一个列表中:
【发布时间】:2023-01-10 17:34:28
【问题描述】:

模型.py

class Cat_Breed_Detail(models.Model):
    id = models.AutoField(primary_key=True,verbose_name="id")
    key_name = models.CharField(max_length=35,default='',null=True,verbose_name="key_name")
    display_name= models.CharField(max_length=35,default='',null=True,verbose_name="display_name")
    def __str__(self):
        return self.key_name


class Cat_Image(models.Model):
    image=models.ImageField(upload_to="ImagesCat/")
    cat=models.ForeignKey(Cat_Breed_Detail,on_delete=models.CASCADE,null=True,related_name='images')
    def image_preview(self):
        if self.image:
            return mark_safe('<img src="{0}" width="150" height="150" />'.format(self.image.url))
        else:
            return '(No image)'

序列化器.py

class CatImageSerializer(serializers.ModelSerializer):
    class Meta:
        model = Cat_Image
        fields = '__all__'
 
class CatDataSerializer(serializers.ModelSerializer):
    class Meta:
        model = Cat_Breed_Detail
        fields = ['id','key_name','display_name','images']

查看.py

    class CatListCreate(ListAPIView):
    queryset = CatBreedDetails.objects.all().order_by('key_name')
    serializer_class = CatDataSerializer
    pagination_class = CustomPagination 

响应我到了这里我得到了嵌套的响应我不想要它我只想要图像中的图像 url 作为列表而不像我目前得到的响应:

{
            "id": 9,
            "key_name": "abyssinian",
            "display_name": "Abyssinian",
            "image": [
                {
                    "id": 3,
                    "image": "/media/Abyssinian_0006.jpg",
                    "cat": 9
                },
                {
                    "id": 4,
                    "image": "/media/Abyssinian_0092.jpg",
                    "cat": 9
                }
            ]
        },
        {
            "id": 18,
            "key_name": "american_bobtail",
            "display_name": "American Bobtail",
            "image": [
                {
                    "id": 5,
                    "image": "/media/American_Bobtail_0004.jpg",
                    "cat": 18
                },
                {
                    "id": 6,
                    "image": "/media/American_Bobtail_0057.png",
                    "cat": 18
                }
            ]
        },
        {
            "id": 19,
            "key_name": "american_curl",
            "display_name": "American Curl",
            "image": [
                {
                    "id": 7,
                    "image": "/media/American_Curl_0078.jpg",
                    "cat": 19
                },
                {
                    "id": 8,
                    "image": "/media/American_Curl_0083.png",
                    "cat": 19
                }
            ]
        }

我想在一个列表中获取所有图像,而不是像 image:{image:"...." ,image:"......"} 我是 djnago 的新手,仍在学习是否有任何方法可以完成它。 有什么办法可以让我得到这样的回应:


{
            "id": 9,
            "key_name": "abyssinian",
            "display_name": "Abyssinian",
            "image":  ["/media/Abyssinian_0006.jpg","/media/Abyssinian_0092.jpg",]
                  
        }

【问题讨论】:

  • 你能分享你的 views.py 文件吗?所以我可以建议你如何获取列表中的所有图像
  • 是的,我将其添加到我的问题中。请检查一下,这对我很有帮助,非常感谢。

标签: python python-3.x django django-models django-rest-framework


【解决方案1】:
[
    {
        "id": 1,
        "key_name": "first cat",
        "display_name": "first cat",
        "images": [
            {
                "image": "http://localhost:8000/ImagesCat/Screenshot_from_2022-12-21_18-16-28.png"
            },
            {
                "image": "http://localhost:8000/ImagesCat/Screenshot_from_2022-12-29_13-41-31.png"
            }
        ]
    }
]

这就是我得到回应的方式,如果你想像你一样,那么你必须重写列表方法

from rest_framework import serializers

from app.models import Cat_Image, Cat_Breed_Detail


class CatImageSerializer(serializers.ModelSerializer):
    class Meta:
        model = Cat_Image
        fields = '__all__'


class CatImageSerializer2(serializers.ModelSerializer):
    class Meta:
        model = Cat_Image
        fields = ['image']


class CatDataSerializer(serializers.ModelSerializer):
    images = CatImageSerializer2(read_only=True, many=True)

    class Meta:
        model = Cat_Breed_Detail
        fields = ['id', 'key_name', 'display_name', 'images']

【讨论】:

  • 感谢您的建议,但我知道我可以通过更改字段中的 CatImageSerializer 来获得此响应我只需要更改 ['image] 而不是全部所以我可以通过我的问题得到它是我可以在单个列表中得到这个而不是在列表中我得到每个图像的对象你可以检查我的问题中的预期响应。
  • 如果你给我正确的代码,那么我会告诉你你将如何做到这一点
  • 你需要什么?我正在使用的所有内容我都已经在我的回答模型、序列化程序中提到过,请查看您还想要什么?
  • 抱歉,您必须覆盖 LISTAPIVIEW.. 然后您将获得预期的输出
  • 如果可能的话,你能分享代码吗,这对我很有帮助谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多