Ich möchte alle Tierbesitzer (Kunden) mit list_display und für jeden Besitzer eine Komma-separate Liste aller ihrer Haustiere anzeigen (Patienten).Holen Sie sich list_display in django admin, um das "viele" Ende einer Viele-zu-eins-Beziehung anzuzeigen
Der Fremdschlüssel befindet sich in der Patiententabelle, sodass ein Besitzer viele Haustiere haben kann, aber ein Haustier nur einen Besitzer haben kann.
Ich habe die folgenden zu arbeiten, würde aber gerne beraten, ob dies ein akzeptabler Ansatz ist.
from .models import Client, Patient
class ClientAdmin(admin.ModelAdmin):
list_display = ('first_name', 'last_name', 'mobile', 'patients')
def patients(self,obj):
p = Patient.objects.filter(client_id=obj.pk)
return list(p)
Vielen Dank für jede Beratung.
UPDATE: Hier, wo ich so weit bin:
Hier ist, was ich habe es geschafft, so weit
class ClientAdmin(admin.ModelAdmin):
list_display = ('first_name', 'last_name', 'mobile', 'getpatients')
def getpatients(self, request):
c = Client.objects.get(pk=1)
p = c.patient_fk.all()
return p
zum Laufen zu bringen Dies folgt die Dokumentation re: following relationships backwards.
Natürlich "repariert" das obige Beispiel die Anzahl der Client-Objekte auf nur einen (pk = 1), also bin ich mir nicht sicher, wie ich die Ergebnisse für alle Clients bekommen würde.
@pleasedontbelong - Ich habe Ihren Code versucht, vielen Dank. Ich mache mit ziemlicher Sicherheit etwas falsch, wie ich bin ein error.but bekommen also Sie die FK wissen hat jetzt
related_name = 'patient_fk'
was erklärt, warum ich verwende patient_set nicht (da FOO_set außer Kraft gesetzt wird)
Also hier ist, was ich habe:
class ClientAdmin(admin.ModelAdmin):
list_display = ('first_name', 'last_name', 'mobile', 'getpatients')
def get_queryset(self, request):
qs = super(ClientAdmin, self).get_queryset(request)
return qs.prefetch_related('patient_fk')
def getpatients(self, obj):
return self.patient_fk.all()
der Fehler ich erhalte, ist „‚Clientadmin‘Objekt hat kein Attribut‚patient_fk‘“ und bezieht sich auf die letzte Zeile des Codes oben.
Irgendwelche Ideen?
Danke!
EDIT
I-Code Brian versucht haben:
class ClientAdmin(admin.ModelAdmin):
list_display = ('first_name', 'last_name', 'mobile', 'getpatients')
def getpatients(self, obj):
p = obj.patient_pk.all()
return list(p)
... und Störung erhalte 'Client' object has no attribute 'patient_fk'
Wenn ich meinen ursprünglichen Code ausführen, ist es noch ok funktioniert:
class ClientAdmin(admin.ModelAdmin):
list_display = ('first_name', 'last_name', 'mobile', 'getpatients')
def getpatients(self, obj):
p = Patient.objects.filter(client_id=obj.pk)
return list(p)
Als Referenz sind hier meine Klassen:
class Client(TimeStampedModel):
first_name = models.CharField(max_length=30)
last_name = models.CharField(max_length=30)
....
class Patient(TimeStampedModel):
client = models.ForeignKey(Client, on_delete=models.CASCADE, related_name='patient_fk')
name = models.CharField(max_length=30)
....
Danke, ich bin immer noch ein wenig verwirrt, also ertragen Sie mit mir :) Können Sie beschreiben, wie ich das Queryset und prefetch_related() verwenden würde? Mein Verständnis ist, dass ich vom Client-Objekt eine "umgekehrte" Suche nach einer Eins-zu-Viele-Beziehung durchführen kann, d.h. alle zugehörigen Patientenfelder für jedes der gegebenen Client-Objekte. So wie es aussieht, habe ich Dutzende von Kombinationen ausprobiert und verstehe es immer noch nicht ganz, also würde ein Anstupsen in die richtige Richtung sehr geschätzt werden. –