Django: Comment accéder provenant par exemple d'un RelatedManager?
-
19-09-2019 - |
Question
Je voudrais accéder à la Foo
instance foo
au sein de ma méthode de gestion baz
:
foo.bar_set.baz()
baz
normalement prendre un argument de type Foo
:
BarManager(models.Manager):
def baz(self, foo=None):
if foo is None:
# assume this call originates from
# a RelatedManager and set `foo`.
# Otherwise raise an exception
# do something cool with foo
De cette façon, à la fois la première requête ci-dessus et la suivante fonctionne de manière identique:
Bar.objects.baz(foo)
Bar
aurait un ForeignKey à Foo
:
class Bar(models.Model):
foo = models.ForeignKey(Foo)
objects = BarManager()
La solution
Si je comprends bien ce que vous voulez correctement, vous devez faire ceci:
BarManager(models.Manager):
use_for_related_fields = True
Modifier apparemment j'ai réussi à manquer le point complètement. Vous pouvez utiliser quelque chose comme ça (peut-être un peu trop « magique » à mon goût, mais bon):
class BarManager(models.Manager):
use_for_related_fields = True
def bar(self, foo=None):
if foo == None:
qs = Foo.objects.all()
for field_name, field_val in self.core_filters.items():
field_name = field_name.split('__')[1]
qs = qs.filter(**{ field_name: field_val })
foo = qs.get()
# do k00l stuff with foo
Autres conseils
, vous pouvez simplement faire dans Django 2.1 au moins:
foo.bar_set.instance
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow