在同一模型的模型中获取模型对象

时间:2016-06-30 17:37:33

标签: django model

我有很多汽车品牌但没有那么多汽车。我只需要购买有汽车的汽车品牌。

问题是如何在CarForRent模型中调用此CarForRent.objects.all()?

以下是我尝试这样做的方法:

     # -*- coding: utf-8 -*-
        from __future__ import unicode_literals
        from django.contrib.auth.models import User
        from django.db import models

        from information.models import CarBrand, CarModel, City


        class CarForRent(models.Model):
            owner = models.ForeignKey(User)
            brand = models.ForeignKey(CarBrand)
            model = models.ForeignKey(CarModel)
            years = models.CharField(max_length=4, choices=CAR_YEAR_CHOICES)
            consumption = models.DecimalField(max_digits=5, decimal_places=2, blank=True)
            body_type = models.CharField(max_length=21, choices=BODY_TYPE_CHOICES)
            fuel_type = models.CharField(max_length=21, choices=FUEL_TYPE_CHOICES)
            transmission_type = models.CharField(max_length=4, choices=TRANSMISSION_TYPE_CHOICES)
            doors = models.CharField(max_length=4, choices=DOOR_TYPE_CHOICES)
            air_conditioner = models.BooleanField(default=True)

            def get_active_car_brands(self):
                brands = []
                active_brands = []
  ---------->   for car in CarForRent.objects.all(): <--------- problem
                    brands.append(car.brand)
                for brand in brands:
                    active_brands.append(CarBrand.objects.get(id=brand))
                return active_brands

1 个答案:

答案 0 :(得分:1)

这是一个通常在表单级别解决的问题。

现在最大的障碍是,没有显示的逻辑显示哪些车型属于哪些汽车品牌。 Django Smart Selects通常用于提供嵌套的外键关系。

如果设置正确并且存在与品牌相关的CarModel模型,我们可以轻松覆盖为品牌提供的模型形式的查询集。以这个通用ModelForm为例;我们将在重写__init__方法中设置查询集。

from django import forms
from myapp.models import CarsForRent

class CarsForRentForm(forms.ModelForm):
    model = CarsForRent
    exclude = [] # or pass a list/tuple of field name string in a 'fields' parameter
    def __init__(self, *args, **kwargs):
        super(CarsForRentForm, self).__init__(*args, **kwargs)
        # access object through self.instance...
        self.fields['brand'].queryset = CarBrand.objects.filter(model__set__count__gt=0) # model__set represents the related_name parameter providen for CarModel's FK relation to CarBrand

没有任何方法可以告诉哪些车型属于哪些汽车品牌,没有办法执行这样的行动。如果这个逻辑到位,请随意添加问题。