gpt4 book ai didi

python - 在 Django Admin 中根据用户过滤查询

转载 作者:行者123 更新时间:2023-12-01 06:00:38 26 4
gpt4 key购买 nike

我正在尝试根据一些三向关系逻辑过滤 m-2-m。我有以下模型(仅作为示例...但是我写得越多,它看起来就像是我想玩的游戏...)请原谅我过度使用 spameggs 元变量...

型号:

class SuperProfile(models.Model):
user = models.ForgeignKey('User')
eggs_unlocked = models.ManyToMany('Egg')
my_kitchen = models.ForeignKey('SuperKitchen')

class SuperKitchen(models.Model):
name = models.CharField(max_length=20)

class Egg(models.Model):
eggyness = models.PostiveIntegerField(help_text=_("how Eggy it is. eg."
"Spam'n'Eggs is over 9000")
kitchens = models.ForeignKey(help_text=_('What kitchen carries this')

问题:作为管理员,在别人的 SuperProfileAdmin 中:

  • 我想根据它们所属的厨房列出它们可以使用哪些鸡蛋
  • 一个人的厨房永远不会改变。
  • 鸡蛋仅出现在一个厨房中。
  • 如何获取 SuperProfileSuperKitchen 的实例来过滤所述其他用户的 Egg 列表>

我不确定这是否清楚,请评论需要澄清的内容。

最佳答案

在您的 EggAdmin 中,您必须重写 queryset 方法

class EggAdmin(admin.ModelAdmin):
...
def queryset(self, request):
kitchen = request.user.superprofile_set.get().my_kitchen #get related users kitchen
qs = super(EggAdmin, self).queryset(request) #call original queryset method that you are overriding
return qs.filter(kitchens=kitchen) #apply your filter

更新:好的,这改变了一切...在 SuperPrifile 管理中,当您打开 SuperProfile 记录时,您希望根据该用户过滤 eggs_unlocked...所以:

import re
# grab the superprofile id from the url
sup_pro_rgx=re.compile(r'(\d+)')
sup_pro = sup_pro_rgx.findall(request.META['REQUEST_URI'])[0]
# I know this is really the ugliest way to do this, but there is no other way (at least as far as i know) to do this


class SuperProfileAdmin(admin.ModelAdmin):
...
def formfield_for_manytomany(self, db_field, request, **kwargs):
if db_field.name == "eggs_unlocked":
my_kitchen = self.get_object(request, object_id=sup_pro).my_kitchen
kwargs["queryset"] = Egg.objects.filter(kitchen=my_kitchen)
return super(SuperProfileAdmin, self).formfield_for_manytomany(db_field, request, **kwargs)

我知道,使用正则表达式来获取对象 ID 是一种非常糟糕的做法,但正如我提到的,据我所知,这是唯一的方法。

这是 formfield_for_manytomany 的文档

关于python - 在 Django Admin 中根据用户过滤查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10649856/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com