首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为django循环追加两个

为django循环追加两个
EN

Stack Overflow用户
提问于 2018-10-04 06:50:37
回答 3查看 528关注 0票数 0

我需要得到相关图像的相册,.I在第一循环中有两个相册,,abc abc123 中有两个相册,abc相册中有两个图像,abc123相册中有3个图像,但是我的响应是在每个相册中返回5个图像。我无法做出正确的反应。

models.py

代码语言:javascript
复制
class Upload(models.Model):
    image=models.ImageField(upload_to='upload/', blank=True, null=True)
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    # url= models.CharField(max_length=500)
    def __str__(self):
        return str(self.id)

class Album(models.Model):
    name = models.CharField(max_length=128)
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    def __str__(self):
        return str(self.name)

class AlbumImage(models.Model):
    album = models.ForeignKey(Album, on_delete=models.CASCADE)
    image = models.ForeignKey(Upload, on_delete=models.CASCADE)

views.py

代码语言:javascript
复制
def getalbum(self,request):
    albums=Album.objects.filter(user=request.user)
    album={}
    image_list={}
    all_results=[]
    all_images=[]
    for a in albums:
        album_images=AlbumImage.objects.filter(album=a)
        for i in album_images:
            image_object=Upload.objects.get(id=str(i.image))
            image_list=str(image_object.image)
            all_images.append(image_list)
        album[a.name]=all_images
    all_results.append(album)
    return Response(all_results)

响应

代码语言:javascript
复制
[
    {
        "abc": [
            "upload/images_aPWBEcp.jpeg",
            "upload/images.jpeg",
            "upload/ic_id_card_placeholder_N0x2KP9.png",
            "upload/images_jocZcBu.jpeg",
            "upload/ic_id_card_placeholder_N0x2KP9.png"
        ],
        "abc123": [
            "upload/images_aPWBEcp.jpeg",
            "upload/images.jpeg",
            "upload/ic_id_card_placeholder_N0x2KP9.png",
            "upload/images_jocZcBu.jpeg",
            "upload/ic_id_card_placeholder_N0x2KP9.png"
        ]
    }
]

abc专辑

上载/图片_aPWBEcp.jpeg

上传/图片

abc123专辑

上传/ic_id_卡_占位符_N0x2KP9.png

上载/图片_jocZcBu.jpeg

上传/ic_id_卡_占位符_N0x2KP9.png

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-10-04 07:04:07

我认为您需要在循环中清空all_images列表,如下所示:

代码语言:javascript
复制
def getalbum(self,request):
   albums=Album.objects.filter(user=request.user)
   album={}
   image_list={}
   all_results=[]
   for a in albums:
        album_images=AlbumImage.objects.filter(album=a)
        all_images = []
        for i in album_images:
            image_object=Upload.objects.get(id=str(i.image))
            image_list=str(image_object.image)
            all_images.append(image_list)
        album[a.name]=all_images
    all_results.append(album)
    return Response(all_results)
票数 2
EN

Stack Overflow用户

发布于 2018-10-04 07:04:26

在此:

代码语言:javascript
复制
all_images=[]
for a in albums:
    album_images=AlbumImage.objects.filter(album=a)
    for i in album_images:
        image_object=Upload.objects.get(id=str(i.image))
        image_list=str(image_object.image)
        all_images.append(image_list)
    album[a.name]=all_images

您将在for循环之前初始化all_images,并继续添加到其中,这样两张专辑最终都会共享相同的图像列表。修复很简单:在for循环中初始化all_images,而不是:

代码语言:javascript
复制
for a in albums:
    all_images=[]
    album_images=AlbumImage.objects.filter(album=a)
    for i in album_images:
        image_object=Upload.objects.get(id=str(i.image))
        image_list=str(image_object.image)
        all_images.append(image_list)
    album[a.name]=all_images

尽管如此,这使得它比必须要复杂得多,而且没有正确地使用django的特性。而不是手动创建AlbumImage模型, instead和避免手动创建列表等(并且获得更好的性能也nt允许ORM优化您的查询)。

票数 3
EN

Stack Overflow用户

发布于 2018-10-04 07:22:12

因为'all_images‘是一个列表,而列表在Python中是可变的。在内循环中,当您在“all_images”列表后面添加时,它也会在引用它的地方得到更新。这也不是获取你想要的信息的正确方法。阅读Django中的序列化器,并将它们用于本例。https://www.django-rest-framework.org/api-guide/serializers/

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52640677

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档