Цикл по указанному полю c в форме django - PullRequest
0 голосов
/ 14 апреля 2020

Обучение Django путем создания приложения для ставок на eBay.

Одна из моих моделей - это простой класс ставок, в котором будет записываться ставка каждого пользователя для определенного листинга.

models.py

class Bid(models.Model):
    bid = models.DecimalField(max_digits=10, decimal_places=2)
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    listing = models.ForeignKey(Listing, on_delete=models.CASCADE)

forms.py

def listing_view(request, id):

    form = BidForm(request.POST or None)

    if form.is_valid():

        instance = form.save(commit=False)
        instance.user = request.user
        instance.listing_id = id

        # check bid is higher than starting bid or other bids or flash error message
        current_bid = instance.bid
        starting_bid = instance.listing.starting_bid
        query = Bid.objects.all().filter(listing=id)

В Forms.py я пишу представление для проверки того, что ставка, введенная пользователем, больше чем существующие ставки. Это неполно, потому что я застрял при создании этого сравнения.

Самый простой способ - это l oop над переменной 'query' и выполнить сравнение, но есть ли более элегантное решение?

Я нашел решение, используя функцию all (), что-то вроде:

all(current_bid > i in my_list)

Но это работает только для сравнения со списком, а не с объектами формы

Есть ли способ l oop над запросом (т. Е. Для каждого в запросе) и проверить, является ли current_bid больше, чем все 'each.bid' в 1 строке?

Примерно так:

all(current_bid > i for i.bid in query)

К сожалению, это не работает. Я получаю NameError - имя 'i' не определено.

Спасибо!

1 Ответ

1 голос
/ 14 апреля 2020

Эта строка здесь:

all(current_bid > i for i.bid in query)

необходимо изменить на что-то вроде этого:

all(current_bid > i.bid for i in query)

Иногда понимание списка сбивает с толку, поэтому мне нравится представлять их как нормальные для циклов. Вот моя интерпретация того, что вы пытаетесь сделать (без гарантий правильности):

is_biggest_bid = True
for i in query:. # writing i.bid wouldn't make sense here
    if i.bid > current_bid:
        is_biggest_bid = False
        break

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...