Как сохранить модель джанго с несколькими изображениями

Бьюсь уже который час, но видимо чего-то не понимаю. Есть задача написать парсер циан с админкой джанго и здесь всё хорошо и работает. Теперь нужно все данные сохранить в базу и здесь проблема, сохраняется всё кроме фото.

# models.py
from django.db import models


class Apartment(models.Model):
    rooms = models.CharField('кол-во комнат', max_length=64)
    price = models.CharField('цена', max_length=10)
    address = models.CharField('Адрес', max_length=256)
    desc = models.TextField('описание')
    floor = models.CharField('этаж', max_length=5)

    def __str__(self):
        return self.address

    class Meta:
        verbose_name = 'квартира'
        verbose_name_plural = 'квартиры'


class Image(models.Model):
    apartment = models.ForeignKey(Apartment, on_delete=models.CASCADE)
    img = models.ImageField(upload_to='media/')

    class Meta:
        verbose_name = 'фото'
        verbose_name_plural = 'фото'


class Url(models.Model):
    created = models.DateTimeField(auto_now_add=True)
    url = models.URLField('ссылка')

    def __str__(self):
        return self.url

    class Meta:
        verbose_name = 'ссылка'
        verbose_name_plural = 'ссылки'
        ordering = ['-created']

# admin.py
from django.contrib import admin

from .models import Apartment, Image, Url
from django.utils.html import format_html  # для отображения фото в админке


class InlineImage(admin.TabularInline):
    fk_name = 'apartment'
    model = Image

    def image_tag(self, obj):
        return format_html(f'<img src="{obj.image.url}" style="width: 50px; height: 50px;"/>')
    image_tag.short_description = 'фото'


@admin.register(Apartment)
class AprtmentAdmin(admin.ModelAdmin):
    list_display = ['address', 'rooms', 'price', 'desc', 'floor']
    inlines = [InlineImage, ]


@admin.register(Url)
class UrlAdmin(admin.ModelAdmin):
    list_display = ['created', 'url']

# парсер и функция записи в бд
def save_data(apartments_list):
    for apartment in apartments_list:
        try:
            Apartment.objects.create(
                rooms=apartment['rooms'],
                price=apartment['price'],
                address=apartment['address'],
                desc=apartment['desc'],
                floor=apartment['floor'],
            )
            for image in apartment['photos']:
                Image.objects.create(
                    apartment = apartment,
                    img=image,
                )
        except Exception as e:
            print(e)
            break


def make_request(url):
    req = requests.get(url, headers=headers, timeout=5, stream=True)
    src = req.text
    soup = BeautifulSoup(src, 'lxml')
    return soup


@receiver(post_save, sender=Url)
def saved_url(instance, created, **kwargs):
    apartments = []

    if created:
        url = instance.url
        soup = make_request(url)
        for link in soup.find_all('div', attrs={'data-name': 'LinkArea'}):
            url = link.find('a').get('href')
            driver.get(url)
            time.sleep(1)
            try:
                rooms = driver.find_element(By.XPATH, '//div[1][@data-name="OfferTitle"]/h1').text
            except:
                rooms = None
            try:
                price = driver.find_element(By.XPATH, '//div[1]/div/span/span[1][@itemprop="price"]').text
            except:
                price = None
            try:
                address = driver.find_element(By.XPATH,
                                              '//section/div/div[1]/div[2]/span[@itemprop="name"]').get_attribute(
                    'content')
            except:
                address = None
            try:
                desc = driver.find_element(By.XPATH, '//div/span/p[@itemprop="description"]').text
            except:
                desc = None
            try:
                floor = driver.find_element(By.XPATH, '//div/div[4]/div[1][@data-testid="object-summary-description-value"]').text
            except:
                floor = None
            try:
                photos = [img.get_attribute('src') for img in driver.find_elements(By.CLASS_NAME, 'fotorama__img')]
                    # images = urllib.request.urlretrieve(photos, photos.split('/')[-1])
            except:
                photos = None


            # image = urllib.request.urlretrieve(photos, photos.split('/')[-1])
            # apartment = Apartment.objects.get_or_create(
            #
            # )
            apartments.append(
                {
                    'rooms': rooms,
                    'price': price,
                    'address': address,
                    'desc': desc,
                    'floor': floor,
                    'photos': photos,
                }
            )
            # for i in apartments:
            #     for j in i['photos']:
            #         print(j)
            save_data(apartments)

Буду очень благодарен за помощь

Вернуться на верх