使用django显示视图,其中包含两个已过滤的模型相关键

时间:2015-10-18 16:40:35

标签: python django django-templates django-views

我无法理解显示特定视图的最佳方法

我有两个这样的模型:

// models.py
class CarDealer(model.Models):
    name = model.TextField()
    slug = model.SlugField()

class Car(model.Models):
    name = model.TextField()
    color = model.TextField()
    dealer = model.ForeignKey('CarDealer', related_name'cars')

以及我想要构建的网址是:

// url.py
url(regex=r'^(?P<car_dealer_slug>[^/]*)/(?P<car_color_one>[^/]*)/(?P<car_color_two>[^/]*)/$',
    view=views.DealerCarColors.as_view(),
    name='dealer_car_colors')

所以网址可以是/ dealer / blue / green,我想显示经销商列表以及他们拥有的蓝色汽车和绿色汽车列表,或者没有汽车列表。

我希望视图显示一个表:

|dealer | color 1| color 2|
---------------------------
|dealer1| car A  | car Z  |
|       | car B  | car X  |
|       | car C  |        |
---------------------------
|dealer2|        |        |
---------------------------

我试图了解如何通过基于类的视图执行此操作,该视图允许分页CarDealers,但仍然能够显示两个相关对象的已过滤列表。

我知道这可能有多种方式,但最正确的方法是什么?即将所有逻辑保留在view.py文件中,而不是使用过滤器。

1 个答案:

答案 0 :(得分:0)

您应该真正整理您的网址并首先考虑它。如果用户想要访问颜色为绿色的汽车,那么他将转到

/dealer/green

如果他想要蓝色,他会去

/dealer/blue

如果他希望汽车颜色为绿色,汽车颜色为蓝色,他会转到上面的每个网址。为什么你希望他把它混合在一个URL中,最后你还是会显示两个单独的汽车列表?视图看起来像这样:

class GetCars(APIView): # I'm using DRF so I'm extending a DRF view
    """
    List the cars based on the users filters.
    """

    def get(self, request, dealer, colorOne, colorTwo):
        cars = CarDealer.objects.filter(name=dealer, cars.color = colorOne) # Django code
        carsTwo = CarDealer.objects.filter(name=dealer, cars.color = colorTwo) # Django Code
        # then return both cars and carsTwo to the front-end

上面的代码使用DRF(我使用的是DRF中的APIView)但是唯一的Django视图将使用类似的逻辑。

编辑:此外,您的帖子说:

“所以网址可能是/经销商/蓝色/绿色,我想显示经销商列表以及他们拥有的蓝色汽车和绿色汽车列表,或者没有汽车列表。

我希望视图显示一个表:“

|dealer | color 1| color 2|
---------------------------
|dealer1| car A  | car Z  |
|       | car B  | car X  |
|       | car C  |        |
---------------------------
|dealer2|        |        |
---------------------------

如果用户专门访问了URL /经销商/颜色(因为这意味着他想要查看该特定经销商的汽车),您真的不应该展示经销商2.

编辑:如果您想要多个Car对象而不是CarDealer对象,可以尝试:

    def get(self, request, dealer, colorOne, colorTwo):
        dealerObject = CarDealer.objects.get(name=dealer)
        cars = Car.objects.filter(dealer=dealerObject, color=colorOne)