Автоматическое исключение дубликатов категорий

У меня проблема с моделью категорий. У меня есть 2 таблицы:

class Category(models.Model):

    user = models.ForeignKey(User, on_delete=models.CASCADE, null=True)

    name = models.CharField(max_length=30, null=False)


class Movie(models.Model):

    category = models.ForeignKey(Category, on_delete=models.CASCADE, null=True)

    name = models.CharField(max_length=30, null=False)

Таким образом, это стандартные модели с категориями. Пользователь может создать категорию, создав фильм с именем категории дополнительно. Проблема возникает, когда пользователь пытается создать фильм с именем категории, которая уже существует, потому что это создаст еще одну категорию с тем же именем (как дубликат), и я хочу избежать этого.

Как это сделать? Я не могу создать уникальное поле имени, потому что многие пользователи могут иметь одну и ту же категорию (но я могу использовать ManyToManyRelation), но все же я не знаю, как автоматически избежать дубликатов, как показано ниже:

  1. Если категория с таким именем и таким пользователем не существует > создайте категорию
  2. .
  3. Если категория с таким именем и таким пользователем существует > используйте эту категорию
  4. .

Приветствует

Хотя ваше объяснение нечеткое. Но из вашего объяснения кажется, что вы хотите, чтобы категории были уникальными для каждого пользователя. Разные пользователи могут иметь одинаковые категории, но один и тот же пользователь не может иметь ни одной дублирующейся категории.

для этого

class Category(models.Model):

    user = models.ForeignKey(User, on_delete=models.CASCADE, null=True)

    name = models.CharField(max_length=30, null=False)

    class Meta:
        unique_together = ["user","name"] #This will 
#make a constraint to check if both user and name is unique

Это предотвратит дублирование категорий. Просто установите unique на True.

class Category(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE, null=True)
    name = models.CharField(max_length=30, unique=True)
Вернуться на верх