Самый эффективный способ написать поле «От многих к случайным» в Django

Прочитал, что поля ManytoMany в Django медленнее, чем ForeignKey lookups (так как они используют вспомогательную таблицу). Я создаю приложение, которое позволяет артистам каталогизировать свои выступления. Каждое выступление в каталоге может содержать несколько изображений. Однако я также хочу указать одно «Геройское изображение» акта, которое будет использоваться для предварительного просмотра при поиске по каталогу. У каждого акта может быть много изображений, но только одно из них может быть заглавным. Я придумал три варианта, но я хочу услышать, что думает улей.

  1. ManytoManyField
from django.db import models
from django.contrib.auth.models import User

# Create your models here.
class Act(models.Model):
    title = models.CharField(max_length=200)
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    description = models.TextField()
    hero_image = models.ForeignKey('Image', on_delete=models.SET_NULL, null=True)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

class Image(models.Model):
    act = models.ManyToManyField(Act)
    image = models.ImageField(upload_to='images/')
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)
  1. Два внешних ключа
from django.db import models
from django.contrib.auth.models import User

# Create your models here.
class Act(models.Model):
    title = models.CharField(max_length=200)
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    description = models.TextField()
    hero_image = models.ForeignKey('Image', on_delete=models.SET_NULL, null=True)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

class Image(models.Model):
    act = models.ForeignKey(Act, on_delete=models.CASCADE)
    image = models.ImageField(upload_to='images/')
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)
  1. Создайте отдельную таблицу только для изображений героев. Это может привести к дублированию данных, если исполнитель включит одно и то же изображение в качестве своего изображения героя и в свою галерею (коллекцию изображений, сопоставленных с актом), но поскольку на один акт приходится только одно изображение героя, я не думаю, что это будет слишком много для хранения данных? Мы также могли бы изменить UI так, чтобы изображение героя по умолчанию отображалось в галерее, и поощрять пользователей НЕ помещать изображение героя в таблицу изображений... интересно узнать, что вы думаете по этому поводу!
class Act(models.Model):
    title = models.CharField(max_length=200)
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    description = models.TextField()
    hero_image = models.ForeignKey(HeroImage, on_delete=SET_NULL, null=True)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

class HeroImage(models.Model):
    image = models.ImageField(upload_to='hero_images/')
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

class Image(models.Model):
    act = models.ForeignKey(Act, on_delete=models.CASCADE)
    image = models.ImageField(upload_to='images/')
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

Я также приму любые другие отзывы о моем коде! Я делаю это как личный проект, так что я использую любую возможность для второй пары глаз. Спасибо!

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