Python 如何通过内容类型ID获取用户

Python 如何通过内容类型ID获取用户,python,django,django-contenttypes,Python,Django,Django Contenttypes,我正在尝试使用django应用程序,该应用程序使用泛型关系,我对内容类型不熟悉。 使用admin,我可以看到一个用户内容类型为14的对象 因此,我可以写一个观点 list = Action.objects.filter(actor_content_type=14) 这将生成与用户对象匹配的所有对象的列表 但是,如果我想要一个特定的用户,例如request.user,我将如何筛选该用户?我尝试了以下方法,但失败了 list = Action.objects.filter(actor_conten

我正在尝试使用django应用程序,该应用程序使用泛型关系,我对内容类型不熟悉。 使用admin,我可以看到一个用户内容类型为14的对象

因此,我可以写一个观点

list = Action.objects.filter(actor_content_type=14)
这将生成与用户对象匹配的所有对象的列表

但是,如果我想要一个特定的用户,例如request.user,我将如何筛选该用户?我尝试了以下方法,但失败了

list = Action.objects.filter(actor_content_type=request.user)
以下是行动模式:

class Action(models.Model)
    user_content_type = models.ForeignKey(ContentType, related_name='actor')
    actor_object_id = models.CharField(max_length=255)
    actor = generic.GenericForeignKey('actor_content_type', 'actor_object_id')
有一些获取内容类型的方法

ContentType.objects.get_for_model(model_or_instance)

ContentType.objects.get_by_natural_key(app_label, model)
这两种方法对其结果使用相同的内部缓存。因此,使用它们而不是直接过滤可以避免影响数据库

但是,如果只需要将内容类型作为子查询,则应进行如下筛选: (假设您的字段名为“actor\u content\u type”)

值得一提的是,尽管在最新的代码段中有一个嵌套查询,django还是将其转换为一条sql语句

如果您计划使用actions actors,请注意,这将影响查询中每个操作的数据库。可以通过手动设置参与者来避免这种情况

user = request.user
actions = Action.objects.filter(
    actor_content_type__app_label="auth",
    actor_content_type__model="user", 
    actor_object_id=user.id)

actor_cache_key = Action.actor.cache_attr
for action in actions:
    setattr(action, actor_cache_key, user)
补充说明:

  • 参与者对象id应该由一个
    PositiveIntegerField
    指定
  • 考虑一起使用
    索引=('actor\u content\u type',
    “actor\u object\u id”),)
    在您的模型元类上

我很困惑。为什么用户会有内容类型?内容类型是特定于模型的,而不是实例。Ak,我也很困惑,我正要编辑这个问题时,我自己发现了这一点。现在我不知道action对象如何存储用户
Action.objects.filter(actor_content=ContentType.objects.filter(app_label="auth", 
        model="user"), actor_object_id=request.user.id)
user = request.user
actions = Action.objects.filter(
    actor_content_type__app_label="auth",
    actor_content_type__model="user", 
    actor_object_id=user.id)

actor_cache_key = Action.actor.cache_attr
for action in actions:
    setattr(action, actor_cache_key, user)