Je viens de rencontrer ForeignKey.limit_choices_to dans les documents Django. Je ne sais pas encore comment cela fonctionne, mais il pourrait juste être le bon pense ici.
Mise à jour: ForeignKey.limit_choices_to permet de spécifier une constante, un appelable ou un objet Q pour restreindre les choix autorisés pour la clé. Une constante n'est évidemment pas utile ici, puisqu'elle ne sait rien des objets impliqués. L'utilisation d'un callable (méthode de fonction ou de classe ou tout objet pouvant être appelé) semble plus prometteuse. Le problème reste comment accéder aux informations nécessaires à partir de l'objet HttpRequest. L'utilisation de thread local storage peut être une solution.
2. Mise à jour: Voici ce que tu as travaillé pour moi:
J'ai créé un milieu tel que décrit articles dans le lien ci-dessus. Il extrait un ou plusieurs arguments de la partie GET de la requête, comme "product = 1" et stocke cette information dans les locals de threads.
Ensuite, il existe une méthode de classe dans le modèle qui lit la variable locale de thread et renvoie une liste d'ID pour limiter le choix d'un champ de clé étrangère.
@classmethod
def _product_list(cls):
"""
return a list containing the one product_id contained in the request URL,
or a query containing all valid product_ids if not id present in URL
used to limit the choice of foreign key object to those related to the current product
"""
id = threadlocals.get_current_product()
if id is not None:
return [id]
else:
return Product.objects.all().values('pk').query
Il est important de renvoyer une requête contenant tous les identifiants possibles si aucun n'a été sélectionné afin que les pages d'administration normales fonctionnent correctement.
Le champ de clé étrangère est alors déclarée comme:
product = models.ForeignKey(
Product,
limit_choices_to={
id__in=BaseModel._product_list,
},
)
Le hic est que vous devez fournir les informations pour limiter les choix par la demande. Je ne vois pas un moyen d'accéder à "soi" ici.
vous ne devriez pas utiliser "null = True", je pense. Regardez dans le doc django – Ber
Le null = True fait référence à CharFields. Ici, il est parfaitement correct d'avoir null = True (sinon les parents ne peuvent pas être sauvés sans un enfant) –