Логіка моделі така:
- А
Building
має багатоRooms
- A
Room
може знаходитися всередині іншогоRoom
(шафа, наприклад - ForeignKey on 'self') - А
Room
може знаходитись всередині іншогоRoom
в одній будівлі (це хитра частина)
Ось код, який я маю:
#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
і:
#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)
У рядку відображатимуться лише кімнати в поточній будівлі (що я і хочу). Проблема, однак, полягає в тому, що для inside_room
випадаючого меню він відображає всі кімнати в таблиці Кімнати (включаючи кімнати в інших будівлях).
У рядку rooms
, мені потрібно обмежити inside_room
вибір лише тим, rooms
що є в поточному building
(будівельний запис в даний час змінюється основною BuildingAdmin
формою).
Я не можу зрозуміти, як це зробити, ані limit_choices_to
в моделі, ані як правильно замінити вбудований набір форм адміністратора (я відчуваю, що я повинен якось створити власну вбудовану форму, передати building_id of основну форму до власної вбудованої, а потім обмежте набір запитів для вибору поля на основі цього - але я просто не можу обернути голову, як це зробити).
Можливо, це занадто складно для сайту адміністратора, але це здається чимось, що було б загалом корисним ...