7
votes

Modèles Django sous-classée avec des requêtes intégrées

Comme dans Cette question , sauf que je veux pouvoir avoir des requêtes qui renvoient un corps mixte d'objets: xxx

j'ai compris que je peux 't vient de définir product.meta.abract 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 __ , je suppose que je suppose que c'est du __ métaclass __ dans le modèle ... Voici le code non django qui se comporte jolie beaucoup comment je le veux: xxx

mais qui échoue si j'hérite de django.db.models.model au lieu de objet : xxx

qui est un backtrage notamment durappy; Je ne peux pas entrer dans le cadre de mon __ nouveau code __ dans le débogueur, non plus. J'ai vraiment essayé super (A, CLS) , haut , super (a, a) , et tout ce qui précède en combinaison avec le passage CLS en tant que premier argument sur __ nouveau __ , 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?


1 commentaires

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.


5 Réponses :


1
votes

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)


1 commentaires

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.



4
votes

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/

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.


1 commentaires

Le lien d'extraits est cassé.



1
votes

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)


0 commentaires

2
votes

vous voulez un d'entre eux:

http://code.google.com/p/django-polymorphic-models /
https://github.com/bConstantin/django_polymorphic

Il y a des descentes, nommément des requêtes supplémentaires.


0 commentaires

1
votes

0 commentaires