Die Logik des Modells ist:
- A
Building
hat vieleRooms
- A
Room
kann sich in einem anderen befindenRoom
(zum Beispiel in einem Schrank - ForeignKey on 'self') - A
Room
kann nur in einem anderenRoom
im selben Gebäude sein (dies ist der schwierige Teil)
Hier ist der Code, den ich habe:
#spaces/models.py
from django.db import models
class Building(models.Model):
name=models.CharField(max_length=32)
def __unicode__(self):
return self.name
class Room(models.Model):
number=models.CharField(max_length=8)
building=models.ForeignKey(Building)
inside_room=models.ForeignKey('self',blank=True,null=True)
def __unicode__(self):
return self.number
und:
#spaces/admin.py
from ex.spaces.models import Building, Room
from django.contrib import admin
class RoomAdmin(admin.ModelAdmin):
pass
class RoomInline(admin.TabularInline):
model = Room
extra = 2
class BuildingAdmin(admin.ModelAdmin):
inlines=[RoomInline]
admin.site.register(Building, BuildingAdmin)
admin.site.register(Room)
In der Inline werden nur Räume im aktuellen Gebäude angezeigt (was ich möchte). Das Problem ist jedoch, dass für das inside_room
Dropdown-Menü alle Räume in der Zimmertabelle angezeigt werden (einschließlich der Räume in anderen Gebäuden).
In der Zeile von rooms
muss ich die inside_room
Auswahl auf nur rooms
die beschränken, die im aktuellen Formular enthalten sind building
(der Gebäudedatensatz wird derzeit durch das Hauptformular geändert BuildingAdmin
).
Ich kann weder mit a limit_choices_to
im Modell einen Weg finden , noch kann ich herausfinden, wie genau das Inline-Formset des Administrators richtig überschrieben werden soll (ich denke, ich sollte irgendwie ein benutzerdefiniertes Inline-Formular erstellen und die building_id von übergeben das Hauptformular auf die benutzerdefinierte Inline, dann beschränken Sie das Abfrageset für die Auswahl des Feldes basierend darauf - aber ich kann mich einfach nicht darum kümmern, wie es geht).
Vielleicht ist dies zu komplex für die Admin-Site, aber es scheint etwas zu sein, das allgemein nützlich wäre ...