1

我成功地为我的项目实施了django-contrib-comments,并开始逐步调整它,使其 100% 适合我的项目。现在我有以下我无法解决的问题:

我有一个模型Poller,它为模型中存储的任何用户提供两个可能的投票Vote。现在,如果用户对轮询器发表评论,我想将他对该特定轮询器的个人投票返回给模板中呈现的评论。

由于我不想以任何方式触及第 3 方的架构,因此我更愿意在我看来获得所需的查询集。

django-contrib-comments 包的评论模型

class CommentAbstractModel(BaseCommentAbstractModel):

    user = models.ForeignKey(settings.AUTH_USER_MODEL, verbose_name=_('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?
4

1 回答 1

1

GenericRelation您可以在模型上定义 aPoller以获取特定投票的所有评论。有了它,我们就可以访问用户,并根据它过滤投票:

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 评论对 object_id 字段使用了不同的名称。要解决这个问题,我们需要添加object_id_field并将其设置为object_pkGenericRelation似乎object_pk正在django-comments使用,添加时无需迁移):

class Poller(models.Model):
    comments = GenericRelation(
        Comment,
        object_id_field='object_pk', # <-- Add this
    )
于 2021-09-19T05:19:37.117 回答