过滤两个模型

时间:2015-01-14 09:48:50

标签: python django

我遇到以下问题:使用下面描述的模型,我需要搜索一辆超过x km里程的汽车,最近一次访问的日期超过一年前。当然,一辆车可以有多次访问。

class Car(models.Model):
    ...
    id = models.CharField(max_length=10, primary_key=True, db_index=True)
    mileage = models.PositiveIntegerField(db_index=True)


class Visit(models.Model):
    ...
    id = models.ForeignKey(Car, db_column='id', db_index=False)
    date = models.DateField(db_index=True)

在views.py中我有这样的代码

def search_car(request):
    time_threshold = datetime.now() - timedelta(days=365)
    cars = Car.objects.filter(mileage__gte=500000,
    id=Visit.objects.filter(data__lt=time_threshold.date()))

  return render(request, 'myapp/search_car.html', {'cars': cars})

不幸的是,它不起作用。有什么想法吗?

编辑确切代码: models.py

class Samochod(models.Model):
marka = models.CharField(max_length=30)
model = models.CharField(max_length=30)
nr_rejestracyjny = models.CharField(max_length=10, primary_key=True, db_index=True)
nr_VIN = models.CharField(max_length=17, unique=True, validators=[validators.MinLengthValidator(17)])
przebieg = models.PositiveIntegerField(db_index=True)
id_uzytkownika = models.ForeignKey(User, db_column='id_uzytkownika', db_index=True)


class Wizyta(models.Model):
id_wizyty = models.IntegerField(primary_key=True, db_index=True)
data = models.DateField(db_index=True)
status = models.CharField(max_length=6, choices=STAN_CHOICE, db_index=True)
id_uzytkownika = models.ForeignKey(User, db_column='id_uzytkownika', db_index=True)
nr_rejestracyjny = models.ForeignKey(Samochod, db_column='nr_rejestracyjny', db_index=False)
przebieg_w_momencie_wizyty = models.PositiveIntegerField()
opis = models.CharField(max_length=200)
id_czesci = models.ForeignKey(Czesci, db_column='id_czesci')
cena = models.PositiveIntegerField()
czas_pracownikow = models.PositiveIntegerField(validators=[validators.MaxValueValidator(1000)])
id_sprzetu = models.ForeignKey(Sprzet, db_column='id_sprzetu', db_index=True)

views.py

def search_car(request):
    time_threshold = datetime.now() - timedelta(days=365)
    samochody = Samochod.objects.distinct().filter(przebieg__gte=500000).exclude(wizyta__date__gte=time_threshold)

    return render(request, 'warsztat_app/search_car.html', {'samochody': samochody})

1 个答案:

答案 0 :(得分:1)

cars = Car.objects.distinct().filter(mileage__gte=500000) \
                             .exclude(visit__date__gte=time_threshold)

对于您的真实模型,代码应如下所示:

samochody = Samochod.objects.distinct().filter(przebieg__gte=500000) \
                                       .exclude(wizyta__data__gte=time_threshold)