2015-10-18 57 views
0

我无法理解,以显示特定视图显示视图,与Django的

最好的方法有两个过滤模型相关键我有两个模型是这样的:

// 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') 

所以URL可以是/经销商/蓝/绿,我想显示的经销商名单,蓝色汽车的清单和绿色汽车他们有,或列表没有车的秒。

我想视图中显示的表:

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

我想了解如何使用基于类的意见,允许CarDealers的寻呼做到这一点,但仍然能够显示两个相关对象的过滤列表。

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

+1

避免产生这种复杂的URL,过滤器/搜索参数而应是在获取数据,如颜色=绿色和颜色? =蓝色。对于我来说,显示多个经销商的汽车是没有意义的,因为/ car_dealer_slug /应该对于只有一个经销商是唯一的。 –

+0

对不起,我还不能编辑我的帖子,但我想在URL中删除经销商。 –

+0

虽然参数在GET数据中,但仍然存在相同的问题,即构建模型数据的最佳做法是什么。 –

回答

0

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

/dealer/green 

,如果他想蓝,他会去

/dealer/blue 

如果他想车颜色为绿色和汽车蓝色,他会去上面的每个网址。为什么你最终希望他在一个网址中混合使用,无论如何你都会显示两个单独的汽车列表?该视图将是这个样子:以上

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|  |  | 
--------------------------- 

你真的不应该显示dealer2如果用户专门跑到URL /经销商/色彩(因为这意味着他想看到那个特定经销商的汽车)。

编辑:如果你想多车的对象,而不是CarDealer对象,你可以尝试:

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

这是关于URL的问题,但更多关于如何构建视图Django的方式。我无法编辑原始问题,但它更像/ dealers /?color = green&color = blue。因此,我希望以上表的格式查看每个经销商的数据。 –

+1

@CodingMonkey哦,对不起。我想我错误地解释了“什么是最正确的方式”。尽管如此,您可能最终会在您的视图中使用“cars = CarDealer.objects.filter(name = dealer,cars.color = colorOne)”,所以我会留下答案,直到其他人有更好的方式。 – user2719875

+0

我试过像'qs = CarDealer.objects.filter(cars_color = colorOne)'这样的查询集合,但是有些如何返回多个CarDealer对象,每个结果对应cars_color一个。 –