用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是:

// 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/blue/green,我想显示一个经销商列表,一个他们有蓝色车和绿色车的列表,或者一个没有车的列表。

我想让视图显示一个表:

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

我试图理解如何做到这一点与基于类的视图,允许分页CarDealers,但仍然能够显示相关对象的两个过滤列表。

我知道有几种方法可以做到这一点,但是哪种方法是最正确的呢?例如,在view.py文件中保留所有逻辑,而不是使用过滤器。

您应该真正组织您的url并首先考虑它。如果用户想要访问绿色的汽车,那么他会去

/dealer/green

如果他想要蓝色,他会去

/dealer/blue

如果他想要绿色和蓝色的汽车,他将访问上面的每个url。你为什么要让他把它混在一个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视图将使用类似的逻辑。

编辑:另外,你的帖子说:

" url可以是/dealer/blue/green,我想显示一个经销商列表,一个他们有蓝色车和绿色车的列表,或者一个没有车的列表。

我想让视图显示一个表:"

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

如果用户专门访问了URL/dealer/color(因为这意味着他想看那个特定经销商的车),你真的不应该显示dealer2。

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

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

最新更新