2009-10-30 6 views
0

je les modèles suivantsjqGrid et modèles django

class Employee(Person): 
    job = model.Charfield(max_length=200) 
class Address(models.Model): 
    street = models.CharField(max_length=200) 
    city = models.CharField(max_length=200) 
class EmpAddress(Address): 
    date_occupied = models.DateField() 
    date_vacated = models.DateField() 
    employee = models.ForeignKey() 

Quand je construis une structure de données JSON pour un objet EmpAddress utilisant le django serialzer il ne comprend pas les champs hérités que les champs de EmpAddress. Je sais que les champs sont disponibles dans l'objet à mon avis car je peux les imprimer mais ils ne sont pas intégrés dans la structure json.

Est-ce que quelqu'un sait comment surmonter cela?

Merci
Andrew

Répondre

0

héritage des modèles Django peut obtenir un little tricky. À moins que vous n'exigiez explicitement que EmpAddress soit une sous-classe de l'adresse, vous voudrez peut-être simplement dupliquer les champs et laisser le typage du canard gérer le fait que vous ne suivez pas la conception orientée objet traditionnelle. Par exemple:

class Address(models.Model): 
    street = models.CharField(max_length=200) 
    city = models.CharField(max_length=200) 

class EmpAddress(Address): 
    street = models.CharField(max_length=200) 
    city = models.CharField(max_length=200) 
    date_occupied = models.DateField() 
    date_vacated = models.DateField() 
    employee = models.ForeignKey() 

Un autre coup dans le noir, vous pouvez essayer est d'utiliser jsonpickle (je suis l'un des développeurs), qui est « plus intelligent » que le module standard JSON. Le latest code a de grandes nouvelles fonctionnalités, grâce à davvid.

+0

Ce ne sont pas mes modèles Je travaille juste avec eux donc ils doivent rester comme ils sont. Je vais vérifier le jsonpickle cependant. Merci. –

0

Jetez un oeil à: http://www.partisanpost.com/2009/10/django-jquery-jqgrid-example-one/1/ comme une solution à votre problème. Le sérialiseur complet vous permet d'explorer les relations étrangères autant que vous le souhaitez. J'ai écrit un exemple de tutoriel sur la façon de l'utiliser pour intégrer Django avec JqGrid, qui fournit un exemple de ce que vous êtes confrontés. J'espère que cela t'aides.

+0

C'est l'exemple que j'ai basé sur le mien il fonctionne pour la clé étrangère mais il ignore l'héritage. Si j'utilise les relations param dans le sérialiseur, j'obtiens toutes les données des employés mais je n'obtiens pas les champs hérités de l'adresse. J'ai regardé le code pour le sérialiseur et il me semble que ce n'est que de travailler avec les champs locaux dans le modèle transmis. Mais je suis encore en train d'apprendre cela pour que je puisse mal comprendre ce code. –

+0

Peut-être que vous pourriez poster votre code d'affichage. Cela serait utile pour trouver une solution. – John

+0

Voir le code ajouté ci-dessus –

0

John,

Ce code est vue J'utilise avec les modèles est;

def address_grid(request): 
    employeeId = request.GET.get('employeeId') 

    if request.GET.get('sidx') == '': 
    order = 'date_occupied' 
    else: 
    order = request.GET.get('sidx') 

    if request.GET.get('sord') == 'asc': 
    sort_order = '' 
    else: 
    sort_order = '-' 

    order = sort_order + order 

    if request.GET.get('page'): 
    paginated = int(request.GET.get('page')) 
    else: 
    paginated = 1 

    items = int(request.GET.get('rows')) 

    addresses = EmpAddress.objects.filter(employee__id=employeeId) 
    for add in addresses: 
    log.write(add.city+'\n') # Field from address object  

    total = adresses.all().count() 

    if total % items > 0: 
    items_sum = 1 
    else: 
    items_sum = 0 

    pages = total/items + items_sum 

    if paginated > pages: 
    paginated = 1 

    addresses = addresses.order_by(order)[paginated-1)*items:paginated*items] 

    rows = serializers.serialize("json", addresses, indent=4,) 

    addresses = '{total:%(pages)s, page:%(page)s, records:%(total)s, rows:%(addresses)s' \ 
      % {'pages':pages, 'page':paginated, 'total':total, 'addresses':rows} 

    log.write(rows+'\n') #json object no Address fields (city is not included) 
         #even it is present above 


    return HttpResonse(addresses, mimetype="application/json") 

Lorsque j'imprime les objets adresses après la ligne
addresses = EmpAddress.objects.filter(employee__id=employeeId)
J'ai tous les objets des attributs (les champs adresse et EmpAddress).

Mais lorsque j'imprime l'objet json j'ai seulement les attributs d'objet EmpAddress excluant les attributs d'adresse.