У меня проблема с набором запросов в Django 2.0, после некоторых исследований я не обнаружил, что проблема похожа на мою.
Я думаю, это из-за того, что моя очень старая унаследованная база данных была создана кем-то, кого я не знал.
Итак, у меня есть база данных sqlite, которая выглядит так:
Как видите, в свойствах таблицы нет primary_key
, поэтому я сделал models
с командой django inspectdb
, которая выглядит так:
from django.db import models
class Record(models.Model):
id = models.IntegerField(db_column='ID', primary_key=True)
class Meta:
db_table = 'Records'
def __str__(self):
return "%s" % self.id
class Propertie(models.Model):
id = models.ForeignKey(Record, models.DO_NOTHING, db_column='ID', primary_key=True)
item = models.CharField(db_column='Item', max_length=500)
value = models.CharField(db_column='Value', max_length=500)
class Meta:
db_table = 'Properties'
def __str__(self):
return '[%s]- %s -> %s' % (self.item, self.value, self.id)
Я установил Properties.id
как primary_key
, но это ForeignKey
, и Джанго говорит установить это поле как OneToOneField
, и это нормально и логично, но 1 Record
связано с 9 Properties
, поэтому Porpertie.id
не может быть unique
это моя первая проблема, потому что я не могу изменить базу данных.
Моя вторая и реальная проблема возникает, когда я запускаю этот запрос:
def my_view(request):
epoch = datetime.date(1970, 1, 1)
period_from = stat_form.cleaned_data.get("period_from")
period_to = stat_form.cleaned_data.get("period_to")
product = stat_form.cleaned_data.get("kit")
timestamp_from = period_from - epoch
timestamp_to = period_to - epoch
records = Record.objects.using("statool").filter(
propertie__item="product",
propertie__value=product,
).filter(
propertie__item="stamp",
propertie__value__gt=str(int(timestamp_from.total_seconds())),
propertie__value__lt=str(int(timestamp_to.total_seconds())),
).count()
этот QuerySet
пуст, но должен вернуть примерно 16XXX Record
Я не знаю, что происходит?
Потому что, если я сделаю этот запрос:
records = Record.objects.using("statool").filter(
propertie__item="product",
propertie__value=product,
)
Он возвращает результат, но второй фильтр не работает...
Цель этого запроса — получить Record
с конкретной датой и названием продукта.
9 возможностей поля item
в Properties
могут быть:
- продукт
- версия
- инструмент
- штамп
- пользователь
- хозяин
- сайт
- проект
- аргументы
Будущий запрос с той же логикой будет применен сразу после получения версии по продукту и по сайту.
Спасибо за помощь! И извините за мой плохой английский :)
propertie__value__gt=str(int(timestamp_from.total_seconds())), propertie__value__lt=str(int(timestamp_to.total_seconds())),
Здесь сравниваетсяvalue
с продолжительностью времени в секундах. Вы уверены, чтоvalue
является атрибутом, по которому вы хотите отфильтровать? - person iacob   schedule 22.06.2018100 < 90
потому что символ1
стоит перед9
. Такое поведение, вероятно, не то, что вы ищете. - person Ralf   schedule 22.06.2018item=="stamp"
,value
равны отметке времени в секундах, но в базе данных они хранятся как TEXT, а не INTEGER. @Ralf Как я могу преобразоватьvalue
, еслиitem==stamp
вQuerySet
? вы правыstr(100) < str(90)
и я думаю, что это может вызвать некоторые проблемы. Но если я перевернуQuerySet
и начну с:records=Record.objects.using("statool").filter(propertie__item="stamp", propertie__value__gt=str(int(timestamp_from.total_seconds())), propertie__value__lt=str(int(timestamp_to.total_seconds())),)
, запрос будет работать, но не если я применю второй - person Florian Couderc   schedule 22.06.2018