Как сохранить модель джанго с несколькими изображениями
Бьюсь уже который час, но видимо чего-то не понимаю. Есть задача написать парсер циан с админкой джанго и здесь всё хорошо и работает. Теперь нужно все данные сохранить в базу и здесь проблема, сохраняется всё кроме фото.
# 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)
Буду очень благодарен за помощь