J'ai défini 2 modèles dans Django (1.7). Ils sont les suivants (versions simplifiées):

from django.db import models
from django.utils import timezone
from datetime import timedelta

class ModelA(models.Model):
    email_addr = models.EmailField(max_length=100,verbose_name='Email')

class ModelB(models.Model):
    my_model = models.ForeignKey(ModelA)
    valid_until = models.DateTimeField('valid until', default=timezone.now()+timedelta(days=2))

Comme on peut le voir, il existe une relation OneToMany entre les 2 modèles. 1 ModelA peut avoir un ou plusieurs ModelBs.

Dans admin.py, j'ai les éléments suivants:

class ModelAAdmin(admin.ModelAdmin):
    list_display = ('id', 'email_addr')

admin.site.register(ModelA,ModelAAdmin)

Je voudrais afficher dans mon administrateur un champ pour chaque enregistrement de ModelA qui affiche la valeur du champ valid_until du dernier enregistrement ModelB connexe. Quelque chose comme:

class ModelAAdmin(admin.ModelAdmin):
    most_recent_valid_until = // retrieve the related ModelB record with the most recent valid until value //
    list_display = ('id', 'email_addr', 'most_recent_valid_until')

Par exemple, disons:

A) il existe 1 enregistrement de ModelS avec les valeurs: is: 1, emailaddr: foo@bar.com

B) il y a 2 enregistrements de ModelB qui sont liés à l'enregistrement avec l'ID 1 de ModelA. Ce sont les suivants: (id: 5, valid_until: 25/10/2014), (id: 6, valid_until: 27/10/2014).

Ensuite, je voudrais que mon administrateur affiche une liste d'enregistrements comme suit:

1 foo@bar.com 27/10/2014

Je suis très nouveau sur Python et Django, alors veuillez m'excuser si ma question est très évidente.

Merci beaucoup!

0
Maestros 5 nov. 2014 à 17:00

4 réponses

Meilleure réponse
class ModelAAdmin(admin.ModelAdmin):
    list_display = (..., 'get_valid_until')

    def get_valid_until(self, obj):
        return obj.modelb_set.last()
    get_valid_until.short_description = 'Valid until'
3
Alex Parakhnevich 5 nov. 2014 à 14:21

list_display recherchera les propriétés de votre ModelAdmin

class ModelAAdmin(admin.ModelAdmin):

    list_display = ('id', 'email_addr', 'most_recent_valid_until')

    def most_recent_valid_until(self, obj):
      # do your query and return the data you want displayed in this row's `most_recent_valid_until` cell

obj est l'instance ModelA et vous pouvez interroger l'instance modèle B associée

Si vous faites une requête dans le calcul de cette propriété, cela fera beaucoup de requêtes sur votre page d'administration ...

1
dm03514 5 nov. 2014 à 14:17

Vous pouvez ajouter une fonction personnalisée à list_display ():

class ModelAAdmin(admin.ModelAdmin):   
    list_display = ('id', 'email_addr', 'most_recent_valid_until')

def most_recent_valid_until(self, obj):
    return obj.modelb_set.all().order_by('-valid_until').first()

(non testé)

0
schneck 5 nov. 2014 à 14:18

Je pense que vous devriez déplacer la clé étrangère d'un modèle à un autre comme ceci:

class ModelA(models.Model):
    my_model = models.ForeignKey(ModelB)
    email_addr = models.EmailField(max_length=100,verbose_name='Email')

class ModelB(models.Model):
    valid_until = models.DateTimeField('valid until', default=timezone.now()+timedelta(days=2))

Puis ajoutez la méthode à une classe ModelA:

def valid_until():
    return self.my_model.valid_until

Et remplacez list_display par:

list_display = ('id', 'email_addr', 'valid_until')

J'espère que cela aide :)

0
KravAn 5 nov. 2014 à 14:17