Django 查询相关对象
Django query for a related object
我有两个模型 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)
现在我想检查用户是否已经将 post 作为我的 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)
可以smb。向我解释这个查询必须是什么样子才能检查它是否已经存在。
目前我收到以下错误:
Cannot query "peter123": Must be "UserBookmarks" instance.
您可以检查 post
是否已被用户添加为书签:
post<b>.bookmarks</b>.filter(<b>user=request.user</b>).exists()
然而,在数据库级别强制执行此操作可能是个好主意,这样就不可能为同一用户存储相同的书签:
class UserBookmarks(models.Model):
# …
class Meta:
<b>constraints</b> = [
models.UniqueConstraint(fields=['user, content_type', 'object_id'], name='unique_bookmark')
]
或在django-2.2之前:
class UserBookmarks(models.Model):
# …
class Meta:
<b>unique_together</b> = [['user, content_type', 'object_id']]
我有两个模型 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)
现在我想检查用户是否已经将 post 作为我的 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)
可以smb。向我解释这个查询必须是什么样子才能检查它是否已经存在。 目前我收到以下错误:
Cannot query "peter123": Must be "UserBookmarks" instance.
您可以检查 post
是否已被用户添加为书签:
post<b>.bookmarks</b>.filter(<b>user=request.user</b>).exists()
然而,在数据库级别强制执行此操作可能是个好主意,这样就不可能为同一用户存储相同的书签:
class UserBookmarks(models.Model):
# …
class Meta:
<b>constraints</b> = [
models.UniqueConstraint(fields=['user, content_type', 'object_id'], name='unique_bookmark')
]
或在django-2.2之前:
class UserBookmarks(models.Model):
# …
class Meta:
<b>unique_together</b> = [['user, content_type', 'object_id']]