Добавить в два для цикла Django - PullRequest
0 голосов
/ 04 октября 2018

Мне нужно получить альбомы с соответствующими изображениями. У меня есть два альбома в 1-м цикле abc и abc123 и два изображения в альбоме abc и 3 изображения в альбоме abc123, но мой ответвозвращает 5 изображений в каждом альбоме.Я не могу создать правильный ответ.

models.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)

views.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"
        ]
    }
]

abc альбом

upload / images_aPWBEcp.jpeg

upload / images.jpeg

abc123 album

upload / ic_id_card_placeholder_N0x2KP9.png

upload / images_jocZcBu.jpeg

upload / ic_id_card_placeholder_N0x2KP9.png

Ответы [ 3 ]

0 голосов
/ 04 октября 2018

Здесь:

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_images перед циклом for и продолжаете добавлять к нему, так что оба альбома в итоге делятся одним и тем же списком изображений.Исправить это просто: вместо этого инициализируйте 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.должным образом.Вместо того, чтобы вручную создавать модель AlbumImage, , вы могли бы использовать M2MField вместо и избежать необходимости вручную создавать списки и т. Д. (И при этом получить более высокую производительность, не позволяя ORM оптимизировать ваши запросы).

0 голосов
/ 04 октября 2018

Поскольку 'all_images' - это список, а список является изменяемым в Python.Во внутреннем цикле, когда вы добавляете список 'all_images', он также будет обновляться везде, где на него ссылаются.Кроме того, это не правильный способ получить информацию, которую вы хотите.Читайте о сериализаторах в Django и используйте их для этого случая.https://www.django -rest-framework.org / апи-гид / сериализаторов /

0 голосов
/ 04 октября 2018

Я думаю, вам нужно очистить список all_images внутри цикла как:

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)
...