Самый эффективный способ написать поле «От многих к случайным» в Django
Прочитал, что поля ManytoMany в Django медленнее, чем ForeignKey lookups (так как они используют вспомогательную таблицу). Я создаю приложение, которое позволяет артистам каталогизировать свои выступления. Каждое выступление в каталоге может содержать несколько изображений. Однако я также хочу указать одно «Геройское изображение» акта, которое будет использоваться для предварительного просмотра при поиске по каталогу. У каждого акта может быть много изображений, но только одно из них может быть заглавным. Я придумал три варианта, но я хочу услышать, что думает улей.
- 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)
- Два внешних ключа
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)
- Создайте отдельную таблицу только для изображений героев. Это может привести к дублированию данных, если исполнитель включит одно и то же изображение в качестве своего изображения героя и в свою галерею (коллекцию изображений, сопоставленных с актом), но поскольку на один акт приходится только одно изображение героя, я не думаю, что это будет слишком много для хранения данных? Мы также могли бы изменить 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)
Я также приму любые другие отзывы о моем коде! Я делаю это как личный проект, так что я использую любую возможность для второй пары глаз. Спасибо!