Хранение списка данных в списке django - PullRequest
0 голосов
/ 29 февраля 2020

Я создаю систему голосования, в которой пользователь голосует против, однако, чтобы пользователь не мог голосовать более одного раза, мне нужно сохранить список всех пользователей, проголосовавших за этот пост. Я использую базу данных sqlite3, которую я хотел бы знать. Как go о сохранении этих пользователей в списке в моей модели постов, я пробовал несколько вариантов, но они не работали.

База данных: sqlite3 Python Версия: 3.8 Django Версия: 3.0.3

текущая попытка:

models.py:

class Upvote(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    post = models.ForeignKey(Post, on_delete=models.CASCADE)

текущий код:

def up_vote(request, pk):
    current_user=request.user
    pk=Post.objects.get(pk)


    try:
        post_instance = Post.objects.get(pk) 
        upvote = Upvote(post=post_instance, user=current_user)
    except Upvote.DoesNotExist:
        post_instance = Post.objects.get(pk)
        upvote = Upvote(post=post_instance, user=current_user)
    return redirect(Post(pk))

Ответы [ 2 ]

1 голос
/ 29 февраля 2020

Вам нужна модель Upvote с внешним ключом для модели Post. Возьмите это в качестве примера:

class Upvote(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    post = models.ForeignKey(Post, on_delete=models.CASCADE)

Как только пользователь проголосует за сообщение, вы создаете строку в таблице Upvote. Вы можете проверить, не проголосовал ли пользователь за публикацию с помощью блока попытки:

try:
    upvote = Upvote.objects.get(post=some_post, user=some_user)
    # User has upvoted
    # Response accordingly
except Upvote.DoesNotExist:
    upvote = Upvote(post=some_post, user=some_user)
    # Create the upvote

Редактировать
Относительно вашей ошибки, когда вы создаете или запрашиваете новый экземпляр модель с внешним ключом, вы должны передать экземпляр внешнего ключа, а не сам класс. Вы сейчас:

upvote = Upvote(post=Post, user=current_user)
# Notice the Post

Post является определением класса Post. Что вам нужно сделать, это создать / получить экземпляр класса Post и передать его. такие как:

post_instance = Post.objects.get(pk=2) # Or whatever query you might need to use or even creating a new post
upvote = Upvote(post=post_instance, user=current_user)
1 голос
/ 29 февраля 2020

Для этого типа данных обычно лучше всего создать новую модель, например, под названием «Upvotes», которая будет иметь 3 поля:

class Upvotes(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    post = models.ForeignKey(Post, on_delete=models.CASCADE)
    timestamp = models.DateTimeField(auto_now_add=True)

Таким образом, вы создадите таблицу, которая будет содержать все пользователи, которые проголосовали за комментарий и за который они проголосовали, включая дату и время.

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...