Модель SQLite Django для инвентаризации семян

Я пытаюсь создать модель инвентаризации для приложения Django, которое обрабатывает продажу семян. Семена хранятся и продаются в упаковках по 3, 5 или 10 семян одного сорта (например: 3 упаковки семян горчицы).

Я хочу добавить количество продуктов в инвентарь с ценой для каждой записи и продавать этот продукт по этой цене до тех пор, пока в этой записи остаются предметы (поле количества> 0), даже если для того же продукта были сделаны более поздние записи и презентация, но по другой цене, поэтому у меня есть следующая модель:

class Product(models.Model):
    name = models.CharField(max_length=100)

class Presentation(models.Model):
    seed_qty = models.IntegerField()

class Stock(models.Model):
    date = models.DateField(auto_now=True)
    quantity = models.IntegerField()
    product = models.ForeignKey(Product, on_delete=models.CASCADE)
    presentation = models.ForeignKey(Presentation, on_delete=models.CASCADE)
    cost = models.FloatField(null=True, blank=True)
    sell_price = models.FloatField(null=True, blank=True)

Мне интересно, действительно ли я должен связать Product и Stock с полем ManyToMany через промежуточную модель GeneralEntry, в которой я бы сохранил date_added, презентацию и стоимость / цену.

Моя проблема заключается в том, что когда я добавляю несколько записей на складе для одного и того же продукта и презентации, я не могу запросить самые ранние цены для каждой доступной (количество> 0) записи на складе для каждого продукта.

То, что я пробовал до сих пор, было:

stock = Stock.objects.filter(quantity__gt=0).order_by('-date')
stock = stock.annotate(min_date=Min('date')).filter(date=min_date)

Но это возвращает, что max_date не определен.

Есть идеи, как запросить или переставить эту модель?

Спасибо!

*** ОБНОВЛЕНИЕ: я не использовал функцию F () из django.db.models.

Это работает так:

stock = Stock.objects.filter(quantity__gt=0).order_by('-date')
stock = stock.annotate(min_date=Min('date')).filter(date=F('min_date'))

person quasimoto    schedule 31.03.2018    source источник
comment
Думаю, вы хотите отсортировать по дате по возрастанию, а не по убыванию stock = Stock.objects.filter(quantity__gt=0).order_by('date')   -  person Alan Hoover    schedule 01.04.2018
comment
@AlanHoover Спасибо, на самом деле он закончил работу с запросом, который я пытался, за исключением того, что мне не хватало функции F для поиска аннотации. Я попытался отсортировать его другим способом с помощью функции Max вместо Min, но повторно запустил последнее, а не самое раннее. : /   -  person quasimoto    schedule 01.04.2018


Ответы (1)


Оказывается, я не использовал функцию F () из django.db.models.

Это работает так:

stock = Stock.objects.filter(quantity__gt=0).order_by('-date')
stock = stock.annotate(min_date=Min('date')).filter(date=F('min_date'))
person quasimoto    schedule 01.04.2018