我需要在管理视图中显示要添加到停车场的汽车列表,到目前为止与此代码良好
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”的可滚动列表
现在我看到所有的车都停在那里
发布于 2016-10-05 15:50:50
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,]
这将在底部创建一个列表,如下所示:
如果你需要更详细的视图,你应该自己创建它们,而不是使用Admin.Admin.同样,Admin是给开发人员的,而不是用户的。
发布于 2016-10-05 14:55:38
您可以查询特定的停车场,然后遍历各个选项。
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
发布于 2016-10-05 15:47:54
Django提供了ForeignKey参数limit_choices_to。这就是你需要的,因为管理员会尊重你的设置。
编写正确的代码留作en练习。该链接将为您提供指导。
https://stackoverflow.com/questions/39877290
复制相似问题