我需要在管理员视图中显示要添加到停车场的汽车列表,到目前为止这段代码还不错
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中我会与映射表进行连接,我会按停车ID过滤
如果我在管理员视图中编辑停车场,我希望看到一个可滚动列表,其中包含" car1"," car2"," car3",以及如果我在管理员视图中编辑另一个停车场,我希望看到一个可滚动列表,其中包含" car4"," car5"," car6"
现在我看到所有停车场的所有车辆
答案 0 :(得分:1)
Django Admin是开发人员的数据库编辑器,不适合用户使用。
考虑到这一点,汽车列表将始终显示所有汽车。要查看哪些车辆属于很多车辆,您需要进入停车列表并编辑其中一个停车对象。在那里,您会看到options
显示为多选列表。
如果您不喜欢多选列表,可以使用ModelAdmin
覆盖它。
from django.contrib import admin
from myapps.models import Parking
class ParkingAdmin(admin.ModelAdmin):
model = Parking
filter_horizontal = ('options',)
这将创建一个如下所示的控件:
但是,如果您需要更完整的相关汽车可编辑表单,则可以使用InlineModelAdmin
。
from django.contrib import admin
from myapp.models import Car, Parking
class CarInline(admin.TabularInline):
model = Car
class ParkingAdmin(admin.ModelAdmin):
inlines = [CarInline,]
这将在底部创建一个列表,如下所示:
如果您需要更详细的视图,则应自行创建,而不是使用管理员。管理员再次为开发人员而非用户。
答案 1 :(得分: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
答案 2 :(得分:0)
Django提供ForeignKey参数limit_choices_to。这就是您所需要的,因为管理员会尊重您的设置。
编写正确的代码留作练习。该链接将指导您。