Построение модели image
Отредактируйте файл models.py приложения images и добавьте в него следующий код:
from django.db import models
from django.conf import settings
class Image(models.Model):
user = models.ForeignKey(settings.AUTH_USER_MODEL, related_name='images_created')
title = models.CharField(max_length=200)
slug = models.SlugField(max_length=200, blank=True)
url = models.URLField()
image = models.ImageField(upload_to='images/%Y/%m/%d')
description = models.TextField(blank=True)
created = models.DateField(auto_now_add=True, db_index=True)
def __str__(self):
return self.title
Это модель, которую мы собираемся использовать для хранения изображений с различных ресурсов. Давайте взглянем на поля этой модели:
- user: Объект User, который создает закладку(bookmarked) это изображение. Это поле ForeignKey, поскольку оно указывает отношение «один-ко-многим»: пользователь может разнести несколько постов с одними и теми же изображениями, но каждое изображение постится одним пользователем.
- title: Заголовок изображения
- slug: Адрес, содержащий в себе только буквы, цифры, знаки подчеркивания или дефисы, которые будут использоваться для создания человекопонятных URL-ов
- url: Оригинальный URL-адрес изображения
- image: Файл изображения
- description: Описание изображения(опционально)
- created: Значение datetime, указывает, когда объект был создан в базе данных. Поскольку мы используем auto_now_add, datetime автоматически устанавливается при создании объекта. Мы используем db_index=True, чтобы Джанго создавал индекс в базе данных для этого поля.
index базы данных повысит скорость запросов. Рекомендуется установить setting db_index=True для полей, которые часто запрашиваются с помощью filter(), exclude(), или order_by(). Наличие ForeignKey поля или поля с unique=True подразумевает создание индекса. Можно также использовать Meta.index_together для создания индексов для нескольких полей.
Мы собираемся переопределить метод save() модели Image для автоматического создания служебного поля на основе значения поля title. Импортируйте функцию slugify() и добавьте в модель Image метод save() следующим образом:
from django.utils.text import slugify
class Image(models.Model):
# ...
def save(self, *args, **kwargs):
if not self.slug:
self.slug = slugify(self.title)
super(Image, self).save(*args, **kwargs)
В этом коде мы используем функцию slufigy(), предоставленную с помощью Джанго, чтобы автоматически генерировать slug изображения для данного заголовка, если он не был предоставлен. Затем мы сохраняем объект. Мы будем автоматически генерировать slug для изображений, чтобы пользователи не вводили его для каждого изображения.