2016-10-05 67 views
0

我需要在管理員顯示查看汽車的列表,添加到停車場了,到目前爲止,這段代碼限制Django的多對多的ID

class Car(models.Model): 
    name = models.CharField(max_length=200) 

class Parking(models.Model): 
    name = models.CharField(max_length=200)   
    options = models.ManyToManyField(Car) 

但在汽車的列表中出現的所有汽車所有停車場好,我只需要顯示添加到某個停車位的車輛,而不是所有車輛。

如何可以存檔?

純SQL我會做與映射表的連接。如果我在管理視圖編輯一個停車場,我想看到「CAR 1」滾動列表我將通過停車ID

過濾, 「car2」,「car3」,如果我在管理視圖中編輯另一個停車位,我希望看到一個帶「car4」,「car5」,「car6」的滾動列表。

現在我看到所有的汽車所有停車場

+0

請問您能展示您期望的結果嗎? – Soviut

回答

0

您可以查詢特定的停車場,然後遍歷選項。

lot = Parking.objects.get(id=1) 
cars = lot.options.all() 

您也可以通過過濾多對多關係來直接查詢汽車。

Car.objects.filter(parking__id=1) 

在任何一種情況下,Django都會在後臺爲您加入連接。如果您想查看Django如何構建查詢,那麼可以使用任何查詢集並使用.query獲取SQL。

print Car.objects.filter(parking__id=1).query 

要了解更多關於進行查詢和做查找整個關係讀https://docs.djangoproject.com/en/1.10/topics/db/queries/#lookups-that-span-relationships

+0

是的,但我無法控制由django自動生成的管理視圖 – BlackBishop

0

的Django提供了ForeignKey的說法limit_choices_to。這是你需要的,因爲管理員會尊重你的設置。

編寫正確的代碼留作練習。該鏈接將指導你。

1

Django Admin是爲開發人員提供的數據庫編輯器,它不適用於用戶。

考慮到這一點,汽車列表將始終顯示所有汽車。要查看哪些車屬於大量車輛,您需要進入泊車列表並編輯其中一個泊車對象。在那裏您會看到options顯示爲多選列表。

如果您不喜歡多選列表,您可以使用ModelAdmin覆蓋它。

from django.contrib import admin 
from myapps.models import Parking 

class ParkingAdmin(admin.ModelAdmin): 
    model = Parking 
    filter_horizontal = ('options',) 

這將創建一個類似如下的控制:

filter_horizontal

但是,如果您需要相關的汽車更完整的可編輯的表格,你可以使用InlineModelAdmin

InlineModelAdmin

如果你需要比這更詳細的意見,你應該自己創建它們並沒有使用Admin:

from django.contrib import admin 
from myapp.models import Car, Parking 

class CarInline(admin.TabularInline): 
    model = Car 

class ParkingAdmin(admin.ModelAdmin): 
    inlines = [CarInline,] 

這將在看上去像底部創建一個列表。再次,管理員是爲開發人員,而不是用戶。