【问题标题】:How to link 3rd party model and view with own model in Django如何在 Django 中将第 3 方模型和视图与自己的模型链接起来
【发布时间】:2021-11-13 04:43:51
【问题描述】:

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

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

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

django-contrib-cmets 包的注释模型

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?

【问题讨论】:

    标签: python django django-models django-queryset django-generic-relations


    【解决方案1】:

    您可以在Poller 模型上定义GenericRelation,以使所有cmets 进行特定轮询。有了它,我们就可以访问用户,并根据它过滤投票:

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

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

    【讨论】:

    • 感谢您的回复,@BrianD。然后,我将如何呈现与该轮询器相关的所有 cmets,包括每个评论创建者在模板中对该轮询器的投票?
    • 是的,试过了,得到了同样的错误。用修复更新了我的答案:)
    猜你喜欢
    • 2018-06-17
    • 2022-01-07
    • 1970-01-01
    • 1970-01-01
    • 2021-06-01
    • 1970-01-01
    • 2019-11-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多