避免同一字段的重复条目

2024-04-25 19:23:09 发布

您现在位置:Python中文网/ 问答频道 /正文

我在django有一个模型choice。它与user模型和items模型具有外键关系。 每个用户都可以从items模型中选择任意数量的项目,choice模型将跟踪有多少用户选择了哪些项目。 一个特定的用户只能选择一个项目,但我的问题是,当user1选择任何项目时,没有其他用户可以再次选择该项目

这是我的选择填充代码

视图.py

def choice_fill(request, cid):
    item_list = item.objects.all()
    title = "Choice Filling"
    page = "Choice Filling"
    if request.method == "POST":
        usr = user.objects.get(id=request.session['id'])
        # return render(request, 'success.html',{'stud':stud})
        if usr.isactive != 1:
            messages.error(request, "Your registration process is incomplete.")
        else:
            if not choice.objects.filter(item_id_id=cid, isactive=1).exists():
                userid = usr.id
                c = choice(user_id_id=studid, item_id_id=cid, isactive=1)
                c.save()
            else:
                return HttpResponse('multiple Entry not allowed')

型号.py

class user(models.Model):
    fullname = models.CharField(max_length=50)
    password = models.CharField(max_length=10)
    email = models.EmailField(unique=True)

class item(models.Model):
    name = models.CharField(max_length=50)
    item_code = models.IntegerField(unique=True)

class choice(models.Model):
    user_id = models.ForeignKey(user, on_delete=models.CASCADE)
    item_id = models.ForeignKey(item, on_delete=models.CASCADE)
    created_at = models.DateTimeField(default=timezone.datetime.now())
    updated_at = models.DateTimeField(default=timezone.datetime.now())
    isactive = models.BooleanField()

Tags: 项目用户模型idifobjectsmodelsrequest
2条回答

您犯了一个错误,即item_id不是外键,而是ManyToManyField。 这是文件Django Many to Many Relationship

所以把它改成

item_id = models.ManyToManyField(item, blank=False)

您需要将选项筛选到与用户关联的选项:

if not usr.choice_set.filter(item_id_id=cid, isactive=1).exists():

您还应该在user_iditem_id上同时添加一个唯一的_,以防止数据库本身中的重复,作为添加的保护层

class choice(models.Model):
    user_id = models.ForeignKey(user, on_delete=models.CASCADE)
    item_id = models.ForeignKey(item, on_delete=models.CASCADE)
    created_at = models.DateTimeField(default=timezone.datetime.now())
    updated_at = models.DateTimeField(default=timezone.datetime.now())
    isactive = models.BooleanField()

    class Meta:
        unique_together = [('user_id', 'item_id')]

最后,您应该将choice命名为Choice,将user_iditem_id属性命名为useritem。作为一个orm,使用choice_instance.user.username比使用choice_instance.user_id.username更有意义

相关问题 更多 >