如何 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_pkobject_pk 似乎是 django-comments 使用的,无需迁移添加时):

class Poller(models.Model):
    comments = GenericRelation(
        Comment,
        object_id_field='object_pk', # <-- Add this
    )