Python 如何通过内容类型ID获取用户
我正在尝试使用django应用程序,该应用程序使用泛型关系,我对内容类型不熟悉。 使用admin,我可以看到一个用户内容类型为14的对象 因此,我可以写一个观点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
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”),)
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)