如何 link 第 3 方模型并在 Django 中使用自己的模型查看
How to link 3rd party model and view with own model in Django
我成功将django-contrib-comments实施到我的项目中,并开始逐步调整它以使其100%适合我的项目。现在我有以下无法解决的问题:
我有一个模型 Poller
,它为存储在模型 Vote
中的任何用户提供两种可能的投票。现在,如果用户对轮询器发表评论,我想 return 他对这个特定轮询器的个人投票到模板中呈现的评论。
因为我不想以任何方式触及第 3 方的体系结构,所以我更愿意在我看来获得所需的查询集。
django-contrib-comments 包的评论模型
class CommentAbstractModel(BaseCommentAbstractModel):
user = models.ForeignKey(settings.AUTH_USER_MODEL, verbose_name=_('user'),
[..]
我的投票器、投票和 Account/User 模型
class Poller(models.Model):
poller_id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
created_on = models.DateTimeField(auto_now_add=True)
created_by = models.ForeignKey(Account, on_delete=models.CASCADE)
[..]
class Vote(models.Model):
poller = models.ForeignKey(Poller, on_delete=models.CASCADE, related_name='vote')
user = models.ForeignKey(Account, on_delete=models.CASCADE)
created_on = models.DateTimeField(auto_now_add=True)
poller_choice_one_vote = models.BooleanField(default=False)
poller_choice_two_vote = models.BooleanField(default=False)
[..]
class Account(AbstractBaseUser):
username = models.CharField(max_length=40, unique=True)
[..]
长话短说,我如何访问每个发表评论的用户的投票模型以确定他投了哪一票?也许通过子类化 CommentAbstractModel
并向 Vote
模型添加外键?
@require_GET
def single_poller(request, poller_id):
"""
renders a specific poller with prepopulated meta according to previous
user interaction, e.g. votes and likes
"""
# Retrieve the item via get
poller = Poller.objects.get(poller_id=poller_id)
[..] # how to go on here?
您可以在 Poller
模型上定义一个 GenericRelation
以获得特定投票的所有评论。有了它,我们就可以访问用户,并基于此过滤投票:
from django.contrib.contenttypes.fields import GenericRelation
class Poller(models.Model):
...
comments = GenericRelation(MyCommentModel) # Change MyCommentModel to the comment model you used
poller = Poller.objects.get(poller_id=poller_id)
votes = Vote.objects.filter(
poller=poller,
user__in=poller.comments.all().values('user')
)
编辑:
django comments 似乎对 object_id 字段使用了不同的名称。要解决这个问题,我们需要添加 object_id_field
并将其设置为 GenericRelation
中的 object_pk
(object_pk
似乎是 django-comments
使用的,无需迁移添加时):
class Poller(models.Model):
comments = GenericRelation(
Comment,
object_id_field='object_pk', # <-- Add this
)
我成功将django-contrib-comments实施到我的项目中,并开始逐步调整它以使其100%适合我的项目。现在我有以下无法解决的问题:
我有一个模型 Poller
,它为存储在模型 Vote
中的任何用户提供两种可能的投票。现在,如果用户对轮询器发表评论,我想 return 他对这个特定轮询器的个人投票到模板中呈现的评论。
因为我不想以任何方式触及第 3 方的体系结构,所以我更愿意在我看来获得所需的查询集。
django-contrib-comments 包的评论模型
class CommentAbstractModel(BaseCommentAbstractModel):
user = models.ForeignKey(settings.AUTH_USER_MODEL, verbose_name=_('user'),
[..]
我的投票器、投票和 Account/User 模型
class Poller(models.Model):
poller_id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
created_on = models.DateTimeField(auto_now_add=True)
created_by = models.ForeignKey(Account, on_delete=models.CASCADE)
[..]
class Vote(models.Model):
poller = models.ForeignKey(Poller, on_delete=models.CASCADE, related_name='vote')
user = models.ForeignKey(Account, on_delete=models.CASCADE)
created_on = models.DateTimeField(auto_now_add=True)
poller_choice_one_vote = models.BooleanField(default=False)
poller_choice_two_vote = models.BooleanField(default=False)
[..]
class Account(AbstractBaseUser):
username = models.CharField(max_length=40, unique=True)
[..]
长话短说,我如何访问每个发表评论的用户的投票模型以确定他投了哪一票?也许通过子类化 CommentAbstractModel
并向 Vote
模型添加外键?
@require_GET
def single_poller(request, poller_id):
"""
renders a specific poller with prepopulated meta according to previous
user interaction, e.g. votes and likes
"""
# Retrieve the item via get
poller = Poller.objects.get(poller_id=poller_id)
[..] # how to go on here?
您可以在 Poller
模型上定义一个 GenericRelation
以获得特定投票的所有评论。有了它,我们就可以访问用户,并基于此过滤投票:
from django.contrib.contenttypes.fields import GenericRelation
class Poller(models.Model):
...
comments = GenericRelation(MyCommentModel) # Change MyCommentModel to the comment model you used
poller = Poller.objects.get(poller_id=poller_id)
votes = Vote.objects.filter(
poller=poller,
user__in=poller.comments.all().values('user')
)
编辑:
django comments 似乎对 object_id 字段使用了不同的名称。要解决这个问题,我们需要添加 object_id_field
并将其设置为 GenericRelation
中的 object_pk
(object_pk
似乎是 django-comments
使用的,无需迁移添加时):
class Poller(models.Model):
comments = GenericRelation(
Comment,
object_id_field='object_pk', # <-- Add this
)