我是django框架的新手,努力从数据库中比较值。 这是我在models.py中的表格:
class Post(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE,)
title = models.CharField(max_length=200)
content = models.TextField()
creationDate = models.DateTimeField(auto_now_add=True)
lastEditDate = models.DateTimeField(auto_now=True)
def __str__(self):
return self.title
class Votes(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE,)
post_id = models.ForeignKey(Post, on_delete=models.CASCADE,)
up_vote = models.PositiveIntegerField(default=0, validators=[MinValueValidator(0), MaxValueValidator(1)])
down_vote = models.PositiveIntegerField(default=0, validators=[MinValueValidator(0), MaxValueValidator(1)])
class Meta:
unique_together = (("user","post_id"),)
现在,我要检查的是上表是否在“投票”表行中已经存在“ user_id”和“ post_id”(如果存在的话),如果在upvote或downvote上没有增加价值,则会抛出一条消息,我想每个人都明白我想要的话,请让我知道。
我尝试的是这段代码:
def chk_table():
user_id = request.user
post_id = id
votes_table = Votes.objects.filter(user_id=user_id, post_id= post_id).exists()
return votes_table
但是此功能正在检查孔表,而不仅仅是在一行中...
答案 0 :(得分:1)
我看到您已经在unique_together
中定义了Meta
,因此您可以使用try except
from django.db import IntegrityError
try:
# your model create or update code here
except except IntegrityError as e:
if 'unique constraint' in e.message:
# duplicate detected
答案 1 :(得分:1)
假设,在您的urls.py
from django.urls import path
from .views import add_vote
urlpatterns = [
path('post/<int:post_id>/vote/add/', add_vote, name='add-vote'),
]
在您的views.py
from django.shortcuts import redirect, render
def add_vote(request, post_id):
if request.method == 'POST':
# receive your POST data here
user_id = request.user.id
post_id = post_id
if not Votes.objects.filter(user_id=user_id, post_id=post_id).exists():
Votes.objects.create(**your_data)
redirect('your-desired-url')
else:
# your logic here