避免同一字段的重复条目
Avoid duplicate entries for the same field
我在 django 中有一个模型 choice
。它与 user
模型和 items
模型具有外键关系。
每个用户可以从 items
模型中选择任意数量的项目,choice
模型将跟踪有多少用户选择了哪些项目。
一个特定的用户只能选择一个项目一次,但我的问题是,当 user1 select 任何项目时,其他用户不能再次选择该项目。
这是我选择填充的代码。
Views.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')
models.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()
您需要将选项筛选为与用户关联的选项:
if not usr.choice_set.filter(item_id_id=cid, isactive=1).exists():
您还应该在 user_id
和 item_id
上添加 unique_together 以防止数据库本身出现重复,作为额外的保护层。
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_id
和 item_id
属性命名为 user
和 item
。作为一个规则,使用 choice_instance.user.username
比 choice_instance.user_id.username
.
更有意义
您犯了一个错误,即 item_id 不是外键,而是 ManyToManyField。
这是文档 Django Many to Many Relationship
所以改成
item_id = models.ManyToManyField(item, blank=False)
我在 django 中有一个模型 choice
。它与 user
模型和 items
模型具有外键关系。
每个用户可以从 items
模型中选择任意数量的项目,choice
模型将跟踪有多少用户选择了哪些项目。
一个特定的用户只能选择一个项目一次,但我的问题是,当 user1 select 任何项目时,其他用户不能再次选择该项目。
这是我选择填充的代码。
Views.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')
models.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()
您需要将选项筛选为与用户关联的选项:
if not usr.choice_set.filter(item_id_id=cid, isactive=1).exists():
您还应该在 user_id
和 item_id
上添加 unique_together 以防止数据库本身出现重复,作为额外的保护层。
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_id
和 item_id
属性命名为 user
和 item
。作为一个规则,使用 choice_instance.user.username
比 choice_instance.user_id.username
.
您犯了一个错误,即 item_id 不是外键,而是 ManyToManyField。 这是文档 Django Many to Many Relationship
所以改成
item_id = models.ManyToManyField(item, blank=False)