如何使用django检查表中是否已存在数据

时间:2019-06-26 23:16:27

标签: django database

我是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"),) 

我的投票表中有如下数据:       enter image description here

现在,我要检查的是上表是否在“投票”表行中已经存在“ 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

但是此功能正在检查孔表,而不仅仅是在一行中...

2 个答案:

答案 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