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)
Вернуться на верх