通过id限制Django ManyToMany

时间:2016-10-05 14:51:23

标签: django django-models

我需要在管理员视图中显示要添加到停车场的汽车列表,到目前为止这段代码还不错

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"

现在我看到所有停车场的所有车辆

3 个答案:

答案 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',)

这将创建一个如下所示的控件:

filter_horizontal

但是,如果您需要更完整的相关汽车可编辑表单,则可以使用InlineModelAdmin

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

class CarInline(admin.TabularInline):
    model = Car

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

这将在底部创建一个列表,如下所示:

InlineModelAdmin

如果您需要更详细的视图,则应自行创建,而不是使用管理员。管理员再次为开发人员而非用户。

答案 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。这就是您所需要的,因为管理员会尊重您的设置。

编写正确的代码留作练习。该链接将指导您。

相关问题