Django запрос для связанного объекта - PullRequest
0 голосов
/ 04 апреля 2020

У меня есть две модели Post и UserBookmarks.

models.py для Project / App1

from App2 import UserBookmarks

class Post(models.Model):
        id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
        author = models.ForeignKey(User, on_delete=models.CASCADE)
        title = models.CharField(verbose_name="Title", max_length=20)
        content = models.TextField(verbose_name="Post Content", max_length=2000)
        ...
        bookmarks = GenericRelation(UserBookmarks, related_query_name='post')

models.py для Project / App2

bookmarkable_models = models.Q(app_label='App', model='post') | models.Q(app_label='App', model='model-b') | models.Q(app_label='App', model='model-c')

class UserBookmarks(models.Model):
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    user = models.ForeignKey(User, on_delete=models.CASCADE, null=False, blank=False)
    content_type = models.ForeignKey(ContentType, limit_choices_to=bookmarkable_models, on_delete=models.CASCADE, null=True, blank=False)
    object_id = models.CharField(max_length=50, blank=False)
    content_object = GenericForeignKey('content_type', 'object_id')
    date_added = models.DateTimeField(auto_now_add=True, blank=False)

Сейчас Я хочу проверить, добавил ли пользователь сообщение в свои закладки как my views.py, но я не понимаю, как должен выглядеть мой запрос на это. В настоящее время я делаю что-то вроде этого:

def post_add_bookmark(request, pk):
    post = get_object_or_404(Post, pk=pk)
    if request.method == 'GET':
        if post.bookmarks.filter(user=request.user).exists():
            messages.error(request,
                           'You already added this Post to your Bookmarks')
            return redirect('post_detail', pk=post.pk)
        else:
            post.bookmarks.create(user=request.user, object_id=post.pk)
            messages.success(request, 'Post has been added to your Bookmarks')
            return redirect('post_detail', pk=post.pk)
    else:
        messages.error(request, 'Something went wrong')
        return redirect('post_detail', pk=post.pk)

Может кто-л. объясните мне, как должен выглядеть этот запрос, чтобы проверить, существует ли он уже или нет. в настоящее время я получаю следующую ошибку:

Невозможно запросить "peter123": должен быть экземпляр "UserBookmarks".

1 Ответ

1 голос
/ 04 апреля 2020

Вы можете проверить, если post уже добавлен пользователем в закладки: хранить одну и ту же закладку для того же пользователя:

class UserBookmarks(models.Model):
    # …

    class Meta:
        <b>constraints</b> = [
            models.UniqueConstraint(fields=['user, content_type', 'object_id'], name='unique_bookmark')
        ]

или до :

class UserBookmarks(models.Model):
    # &hellip;

    class Meta:
        <b>unique_together</b> = [['user, content_type', 'object_id']]
...