Comme dans Cette question , sauf que je veux pouvoir avoir des requêtes qui renvoient un corps mixte d'objets: j'ai compris que je peux 't vient de définir mais qui échoue si j'hérite de qui est un backtrage notamment durappy; Je ne peux pas entrer dans le cadre de mon product.meta.abract code> sur true ou autrement ou ensemble des requêtes d'objets différents. Bien, mais ce sont toutes des sous-classes d'une classe commune, donc si je quitte leur superclasse en tant que non abstrait, je devrais être heureux, tant que je peux obtenir son gestionnaire de retourner des objets de la classe appropriée. Le code de requête à Django fait sa chose et appelle simplement des appels vers le produit (). Semble assez facile, sauf qu'il souffle lorsque je remplace
produit .__ nouveau __ code>, je suppose que je suppose que c'est du
__ métaclass __ code> dans le modèle ... Voici le code non django qui se comporte jolie beaucoup comment je le veux: p>
django.db.models.model code> au lieu de
objet code>: p>
__ nouveau code __ code> dans le débogueur, non plus. J'ai vraiment essayé
super (A, CLS) code>,
haut code>,
super (a, a) code>, et tout ce qui précède en combinaison avec le passage
CLS code> en tant que premier argument sur
__ nouveau __ code>, tout en vain. Pourquoi cela me frappe-t-il si fort? Dois-je comprendre les métaclasses de Django pour pouvoir résoudre ce problème ou y a-t-il un meilleur moyen d'accomplir mes fins? P> p>
5 Réponses :
ok, cela fonctionne: https://gist.github.com/348872
Le peu délicat était ceci. P>
class A(Top): pass def newA(cls, *args, **kwargs): # [all that code you wrote for A.__new__] A.__new__ = staticmethod(newA)
Il h. Eh bien, cela me donne le comportement de sous-classement nécessaire, mais Oh ne casse-t-il jamais toutes mes relations! Aucun de mes objets ne peut alors se rapporter à d'autres modèles. Je vais le rechercher plus loin pour voir si je peux résoudre cet aspect.
En gros, ce que vous essayez de faire, c'est de retourner les différentes classes d'enfants, tout en interrogeant une classe de base partagée. C'est-à-dire que vous voulez les cours de feuilles. Vérifiez cet extrait pour une solution: http://www.djangosnippets.org/snippets/1034/ a> p>
Assurez-vous également de consulter les DOCS sur le cadre du contenu de Django de Django: HTTP : //docs.djangoproject.com/fr/dev/ref/contrib/contenttypes/ Cela peut être un peu déroutant au début, mais le contenuTypes résoudra des problèmes supplémentaires auxquels vous ferez probablement face à des classes de base non abstraites. avec Orm de Django. P>
Le lien d'extraits est cassé.
Collez simplement @staticmeThod avant le __ nouveau __ code> méthode.
@staticmethod
def __new__(cls, *args, **kwargs):
print args, kwargs
return super(License, cls).__new__(cls, *args, **kwargs)
vous voulez un d'entre eux: p>
http://code.google.com/p/django-polymorphic-models /
https://github.com/bConstantin/django_polymorphic p>
Il y a des descentes, nommément des requêtes supplémentaires. P>
Une autre approche que j'ai récemment trouvée: http://jeffelmore.org/2010/11/11/automatic-downcasting-of-herited-Models-in-django/ P>
Il est tentant d'essayer de comprendre le puzzle, mais instinct me dit que vous le faites mal. C'est comme une torture à la pauvre orm de Django.