【问题标题】:Trying to create a progress app with Django ContentType and GenericForeignKey尝试使用 Django ContentType 和 GenericForeignKey 创建进度应用程序
【发布时间】:2013-12-31 21:14:25
【问题描述】:

我有一个名为 Progress 的应用。我想在我的项目中让几个不同的应用程序在发生任何事情时写入它。但是所有不同的应用程序在广播进度方面并不相同。所以我认为 ContentType 解决方案会起作用。

我很难弄清楚的唯一技巧是,我需要在事件发生时写入 Progress 应用程序。例如当视图呈现时。我一直在尝试get_or_create,但我无法在查询集中获得正确的配置。有关如何纠正此问题的任何建议?

我希望 get_or_create 位于应用程序的视图中,以便我想要的操作是写入进度的内容。

我的进度模型.py

from django.db import models
from django.template.defaultfilters import slugify
from django.utils.translation import ugettext_lazy as _
from django.contrib.auth.models import User
from django.contrib.contenttypes.models import ContentType
from django.contrib.contenttypes import generic
from datetime import datetime

class Progress(models.Model):
    """
    The page log. Records the user and the object.
    """
    user = models.ForeignKey(User, related_name='user_pagelog')
    content_type = models.ForeignKey(ContentType)
    object_id = models.PositiveIntegerField()
    content_object = generic.GenericForeignKey('content_type', 'object_id')
    stamp = models.DateTimeField(auto_now_add=True)

    class Meta:
        unique_together = (('user', 'content_type', 'stamp'),)
        verbose_name = 'View Log'
        verbose_name_plural = 'View Logs'
        get_latest_by = 'stamp'

    def __str__(self):
        return "%s got to %s on %s" % (self.user, self.content_type, self.stamp)

    @classmethod
    def get_latest_view(cls, user):
        """
        Get most recent view log value for a given user.
        """
        try:
            view_log = cls.objects.filter(user=user).order_by('-stamp')[0]
            return view_log.value
        except IndexError:
            return None

我要写入 Progress 应用的查询集示例:

    Progress.objects.get_or_create(user=request.user, content_type=f.id)

在哪里f = get_object_or_404(Page, publish=True)

最后,我得到的错误:

Cannot assign "1": "Progress.content_type" must be a "ContentType" instance.

我认为这意味着找不到实例?但它存在,所以我很困惑。

谢谢。

【问题讨论】:

    标签: django django-models django-views django-contenttypes


    【解决方案1】:

    不,根本不是这个意思。它的意思是,参数必须是 ContentType 模型的实例,而您传递的是对象本身的 ID。

    您也许可以将content_type 与实际实例一起使用:

    Progress.objects.get_or_create(user=request.user, content_object=f)
    

    否则,您需要使用 get_for_model() 方法获取正确的 ContentType,并将其与对象 ID 一起传递。

    【讨论】:

      猜你喜欢
      • 2014-03-30
      • 2019-05-19
      • 1970-01-01
      • 2011-09-11
      • 2021-08-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多