1

3 方向のリレーショナル ロジックに基づいて m-2-m をフィルタリングしようとしています。私は次のモデルを持っています(例のみ...しかし、私がそれを書くほど、それは私がプレイしたいゲームのように見えますspam... eggs

モデル:

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 で:

  • 彼らが何の一部であるかにeggs基づいて、彼らが使用できるものをリストしたいkitchen
  • 人のKitchen気持ちは、いつになっても変わりません。
  • Eggs1 つだけに表示されkitchenます。
  • のインスタンスを取得する方法、SuperProfileまたは他のユーザーのリストSuperKitchenをフィルター処理する方法Egg

これが明確かどうかはわかりません。明確にする必要があることについてコメントしてください。

4

2 に答える 2

2

では、メソッド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のドキュメントがあります

于 2012-05-18T09:34:24.143 に答える
0
Eggs.objects.filter(kitchens=profile.my_kitchen)
于 2012-05-18T10:14:31.153 に答える