как отфильтровать объекты модели по внешнему ключу связанной таблицы в django REST - PullRequest
0 голосов
/ 25 апреля 2018

Я хочу сделать API для ресторана, а мой models.py выглядит так:

class Table(models.Model):
    id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=30, null=False, blank=False)
    is_free = models.BooleanField(default=True)

    def __str__(self):
        return '%s %s %s' % (self.id, self.name, self.is_free)


class Order(models.Model):
    order_id = models.AutoField(primary_key=True)
    table_id = models.ForeignKey(Table, on_delete=models.CASCADE)
    total_price = models.IntegerField()
    factor_id = models.IntegerField()

    def __str__(self):
        return '%s %s %s' % (self.order_id, self.table_id.id, self.total_price)


class OrderDetail(models.Model):
    order_detail_id = models.IntegerField(primary_key=True)
    order_id = models.ForeignKey(Order, on_delete=models.CASCADE)
    food_id = models.ForeignKey(Food, on_delete=models.CASCADE)
    amount = models.IntegerField()
    price = models.IntegerField()

    def __str__(self):
        return '%s %s %s' % (self.order_detail_id, self.order_id, self.food_id.name)

Когда создается ордер с таблицей, некоторые OrderDetails должны добавить к нему.

Я хочу отфильтровать все объекты OrderDetail для конкретной таблицы и для последнего Order (я имею в виду все объекты OrderDetail, которые сейчас активны). URL запроса клиента с фильтром содержит table_id, а не order_id. Как я могу отфильтровать объекты OrderDetail по таблице, в которой они есть?

Каждая таблица может иметь только один ордер за один раз. Когда ордер создается с определенной таблицей, is_free будет установлен в False. Поэтому поле table_id класса Order должно быть models.ForeignKey, а не models.OneToOneField, я так думаю! :) Если это не так, скажите, пожалуйста.

Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 25 апреля 2018

Попробуйте,

order_detail_queryset = OrderDetail.objects.filter(
    order_id__table_id=table_id,
    order_id=Order.objects.filter(
        table_id=table_id).latest(
        'table_id'))


Я не проверял ответ, но он может работать как ожидалось

0 голосов
/ 25 апреля 2018

Из вашей модели я понял, что Таблица никогда не получает новых записей, и вы генерируете новый Заказ на основе Таблицы с is_free установлен на ИСТИНА .

Итак, чтобы получить Order от table_id , вам необходимо поле, с помощью которого вы можете получить самый последний заказ этой Table . Прямо сейчас у вас есть order_id , но я бы не советовал вам это делать. Лучше всего добавить поле даты / времени в класс Order .

Ваш запрос может выглядеть примерно так:

SELECT * FROM OrderDetail WHERE order_id = (SELECT order_id FROM Order WHERE table_id = <table_id> ORDER BY date_time DESC LIMIT 1)

Надеюсь, это поможет.

...