Link Search Menu Expand Document

Связи моделей

Если мы хотим связать разные модули (например новости и категории новостей), то нам необходимо сделать следующее:

  1. Создать новый класс (например категорий новостей). Делается это в файле models.py модуля новостей:

     class Category(models.Model):
         title = models.CharField(max_length=150, db_index=True, verbose_name='Наименование категории')
    
         def __str__(self):	# Добавляем строковое представление объекта
             return self.title
    
         class Meta:
             verbose_name = 'Категория'  # наименование модели в единственном числе
             verbose_name_plural = 'Категории'  # наименование модели во множественном числе
             ordering = ['title']
    
    ПараметрОписание
    db_index=TrueДелаем поле индексируемым, тем самым ускоряем поиск по нему
  2. Далее в классе новостей добавляем новое поле ForeignKey:
     category = models.ForeignKey('Category', on_delete=models.PROTECT, null=True, verbose_name='Наименование категории')
    
    ПараметрОписание
    on_delete=models.PROTECTЗащита от удаления связанных данных
    null=TrueДанное поле необходимо при предотвращении конфликтов возникающих при добавлении новой обязательной колонки. Все уже добавленные новости будут иметь данное поле со значением null.
  3. Выполняем подготовку миграции и выполняем миграцию

  4. Для отображения категорий в админке нужно в файле admin.py:
  • Импортировать модуль:
    from .models import Category
    
  • Зарегистрировать модуль
    admin.site.register(Category, CategoryAdmin)
    
  • Настроить отображения в админке
    class CategoryAdmin(admin.ModelAdmin):
      list_display = ('id', 'title')
      list_display_links = ('id', 'title')
      search_fields = ('title',)