You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django中如何避免用户创建电影时重复生成同名分类?

解决同一用户下分类重复创建的问题

1. 数据库层面保证唯一性

首先给Category模型添加联合唯一约束,确保同一用户下的分类名称不会重复,不同用户可以使用同名分类:

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')
        # 如果你用的是Django 2.2及以上版本,更推荐用UniqueConstraint(支持更多场景):
        # constraints = [
        #     models.UniqueConstraint(fields=['user', 'name'], name='unique_user_category')
        # ]

添加约束后,数据库会阻止同一用户创建同名分类,避免并发场景下的重复创建问题。

2. 业务逻辑自动复用/创建分类

在创建电影时,使用Django内置的get_or_create方法,它会自动执行“查询-不存在则创建”的原子操作,完美匹配你的需求:

普通视图中的示例:

# 假设你从请求中获取当前用户和分类名
current_user = request.user
category_name = request.POST.get('category_name')
movie_name = request.POST.get('movie_name')

# 获取或创建分类:存在则返回已有实例,不存在则新建
category, _ = Category.objects.get_or_create(
    user=current_user,
    name=category_name
)

# 创建电影并关联分类
Movie.objects.create(
    category=category,
    name=movie_name
)

Django REST Framework序列化器中的示例:

如果你用DRF,可以在序列化器的create方法中处理:

from rest_framework import serializers

class MovieSerializer(serializers.ModelSerializer):
    # 接收前端传入的分类名(仅用于写入)
    category_name = serializers.CharField(write_only=True)

    class Meta:
        model = Movie
        fields = ['name', 'category_name']

    def create(self, validated_data):
        # 取出分类名,从验证数据中移除
        category_name = validated_data.pop('category_name')
        # 获取当前请求用户
        user = self.context['request'].user
        # 获取或创建分类
        category, _ = Category.objects.get_or_create(user=user, name=category_name)
        # 将分类关联到电影
        validated_data['category'] = category
        # 调用父类方法创建电影
        return super().create(validated_data)

说明

  • get_or_create是原子操作,即使多个请求同时触发,也不会导致重复创建(配合数据库的唯一约束双重保障)。
  • 联合唯一约束确保了数据层面的一致性,避免脏数据产生。

内容的提问来源于stack exchange,提问作者iqaz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 12:10:51