首页 > 解决方案 > 追加两个for循环django

问题描述

我需要获取带有相关图像的相册。我在第一个循环 abcabc123中有两个相册,在 abc 相册中有两个图像,在 abc123 相册中有 3 个图像,但我的回答是在每个相册中返回 5 个图像。我无法做出正确的回应。

模型.py

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)

视图.py

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)

回复

[
    {
        "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"
        ]
    }
]

美国广播公司专辑

上传/images_aPWBEcp.jpeg

上传/images.jpeg

abc123专辑

上传/ic_id_card_placeholder_N0x2KP9.png

上传/images_jocZcBu.jpeg

上传/ic_id_card_placeholder_N0x2KP9.png

标签: pythondjangopython-3.xpython-2.7django-views

解决方案


这里:

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_imagesfor 循环之前进行初始化并继续附加它,因此两个相册最终共享相同的图像列表。修复很简单:all_images改为在 for 循环中初始化:

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 的功能。您可以使用 a代替手动创建AlbumImage模型,而无需手动创建列表等(并获得更好的性能也不允许 ORM 优化您的查询)。M2MField


推荐阅读