Django Запрос максимального значения для столбца, который также включает в себя таблицу внешнего ключа - PullRequest
0 голосов
/ 21 марта 2020

У меня есть две похожие модели -

class Auction(models.Model):
  uuid = models.UUIDField(primary_key=True, default=uuid4, editable=False)
  # other properties

и

class MaxBid(models.Model):
    uuid = models.UUIDField(primary_key=True, default=uuid4, editable=False)
    value = models.DecimalField(
        decimal_places=2,
        max_digits=10,
        validators=[MinValueValidator(MINIMUM_TRANSACTION_VALUE)]
    )
    created = models.DateTimeField(default=timezone.now)
    auction = models.ForeignKey(
        'Auction',
        on_delete=models.CASCADE,
        related_name='bids'
    )
    user = models.ForeignKey(
        get_user_model(),
        on_delete=models.CASCADE,
        related_name="bids"
    )

Я хочу получить максимальную ставку, которую пользователь сделал на аукционе, и столбцы аукциона в SINGLE django SQL запрос.

Этот вопрос SO - SQL выбор только строк с максимальным значением в столбце - помог мне увидеть способ делая это в необработанном виде sql -

SELECT * FROM "products_maxbid" as m
JOIN "products_auction" as a on m.auction_id = a.uuid
WHERE m.uuid in (
    SELECT m.uuid FROM "products_maxbid" as m
    INNER JOIN (
        SELECT auction_id, Max(value) as value FROM "products_maxbid"
        WHERE user_id = '2'
        GROUP BY auction_id
) n
on m.auction_id = n.auction_id and m.value = n.value and m.user_id = '2'
)
ORDER BY a.square_id # can apply any orders now to the auction table like normal

Я не знаю, с чего начать достигать этого в Django - ну, конечно, документы, но там ничего не выделяется.

Все, что я разработал, это подзапрос внутри INNER JOIN -

bids = MaxBid.objects.filter(user=some_user).values("auction").annotate(max=Max('value')).order_by()

Когда я пытаюсь использовать это с filter, он жалуется, что в одном запросе возвращены два столбца. Итак, я думаю, первый вопрос - как мне сделать INNER JOIN так, как это делает raw SQL?

Возможно ли это через ORM? Этот ответ вселяет в меня надежду, но я не могу обернуть голову вокруг него - Django: запись с максимальным элементом

Обновление -

Я не осознавал, насколько просты необработанные SQL запросы, поэтому будут только они

1 Ответ

0 голосов
/ 21 марта 2020
#In django you must create a class and import Model , look here (example)

from django.db import models

class Blog(models.Model):
    name = models.CharField(max_length=100)
    tagline = models.TextField()

    def __str__(self):
        return self.name

class Author(models.Model):
    name = models.CharField(max_length=200)
    email = models.EmailField()

    def __str__(self):
        return self.name

class Entry(models.Model):  # pass info  of your tables
    blog = models.ForeignKey(Blog, on_delete=models.CASCADE)
    headline = models.CharField(max_length=255)
    body_text = models.TextField()
    pub_date = models.DateField()
    mod_date = models.DateField()
    authors = models.ManyToManyField(Author)
    number_of_comments = models.IntegerField()
    number_of_pingbacks = models.IntegerField()
    rating = models.IntegerField()

    def __str__(self):
        return self.headline

# How can I see the raw SQL queries Django is running?

# Make sure your Django DEBUG setting is set to True. Then do this:

>>> from django.db import connection
>>> connection.queries
[{'sql': 'SELECT polls_polls.id, polls_polls.question, polls_polls.pub_date FROM polls_polls','time': '0.002'}]

# it's like "embedded queries"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...