Django- Как разрешить только заданное количество дубликатов с помощью UniqueConstraint?
Я делаю веб-страницу - пункт проката, где можно взять напрокат фильмы, музыкальные диски и книги. Я создал модель cd -
class Cd(models.Model):
cd_band=models.CharField(max_length=100)
cd_title=models.CharField(max_length=100)
CD_GENRE= (
('POP', "POP"),
("HIP", "Hip-Hop"),
("ROC", "Rock"),
("BLU", "Blues"),
("SOU", "Soul"),
("COU", "Country"),
("JAZ", "Jazz"),
("CLA", "Classical music"),
)
cd_genre=models.CharField(max_length=3, choices=CD_GENRE)
cd_length=models.DurationField()
cd_rental=models.ForeignKey(Rental, on_delete=models.CASCADE, default=1)
def __str__(self):
# return self.cd_title, '\n', self.cd_band, '\n'
return "{} {} {}".format(self.cd_band,self.cd_title,self.cd_genre)
Но есть правило, которое я должен применить здесь:
Одна группа может предлагать диски не более чем в 2 жанрах. То есть, допустим, я создаю диск группы Band1 - Band1 может иметь диски только в 2 жанрах - например, рок и блюз. Я понятия не имею, как это реализовать. Я думаю сделать ограничение, но не знаю, какое условие реализовать:
UniqueConstraint.condition(fields=['cd_band','cd_genre'],condition=??????, name='unique_cd')
Я также думал о реструктуризации всей моей базы данных - сделать отдельные классы для групп и музыкальных жанров, а затем связать их с помощью внешних ключей, установить валидаторы. Я думаю, что это должно сработать, но мне придется проделать очень много работы. Есть ли какой-нибудь другой способ сделать это?
Если вы хотите, чтобы база данных была структурирована таким образом, что, IMO, не очень хорошо для манипуляций и будущих возможностей. Я бы поместил проверку в метод save()
. Что-то вроде этого:
def save(self, *args, **kwargs):
bands_genres = set(Cd.objects.filter(cd_band=self.cd_band).values_list("cd_genre", flat=True))
bands_genres.add(self.cd_genre)
if len(bands_genres) > 2:
raise SomeException
super().save(*args, **kwargs)