Queryset filter() в Django с использованием ForeignKey

У меня проблемы с Django queryset. Прежде всего, я хочу получить от клиента информацию о том, какие скидочные купоны (dc для краткости) он/она использовал/а, а затем сравнить с теми, которые уже есть в системе. И мне удалось сделать это с 1

моя точка зрения:

    @login_required(login_url='login')
    def cupons(request):
       produtos = Produto.objects.all()
       cliente = Cliente.objects.get(user=request.user)
       pedido = Pedido.objects.all().get(cliente=cliente)
    return render(request, 'cupons.html', {'lista': produtos, 'venda': pedido.produto.cupom})

Успешный результат enter image description here

P.S: Есть 2 Usado (Подержанные), потому что у них одинаковые "dc"

Проблема начинается, когда пользователь использует 2 или более "dc", он говорит, что get() получил более 1 результата и после некоторых исследований я обнаружил, что мне нужно использовать фильтр, но кто-нибудь может объяснить мне, как можно достичь того же результата, используя фильтр?

Мои классы - Cliente (Клиент), Produto (Продукт) и Pedido (Заказ).

моя модель:

class Cliente(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    ...

class Produto(models.Model):
    STATUS = (
        ('Novo', 'Novo'),
        ('Expirado', 'Expirado'),
        ('Usado', 'Usado'),
    )

    ...
    ...
    cupom = models.CharField(max_length=200, null=True)
    ...

class Pedido(models.Model):  
    cliente = models.ForeignKey(Cliente, null=True, on_delete=models.SET_NULL)
    produto = models.ForeignKey(Produto, null=True, on_delete=models.SET_NULL)
    ...

Просто для уверенности мой html:

                      {% for i in lista %}
                        <tr>
                            <td ><img src="{{i.lojista.imagem}}" class="logo_lojista"> </td>
                            <td> {{i.nome}}</td>
                            <td><a class="btn btn-outline-danger  btn-sm btn-block td_cupom" href="{% url 'liberar_form' i.id %}" >Liberar Cupom</a></td>
                            {%if venda != i.cupom %}
                            <td class="td_status"> {{i.status}}</td>
                            {%else%}
                            <td class="td_status">Usado</td>
                            {%endif%}
                            <td class="td_desconto"> {{i.desconto}}</td>
                            <td class="td_estoque"> {{i.estoque}}</td>
                        </tr>
                    {% endfor %}

Используя приведенный ниже код, я получил результат queryset со списком с номерами моих заказов, теперь я хочу извлечь поле cupom (купон) из Product (FK). Кто-нибудь может мне помочь?

  @login_required(login_url='login')
def cupons(request):
    produtos = Produto.objects.all()
    cliente = Cliente.objects.get(user=request.user)
    pedido = Pedido.objects.all().filter(cliente=cliente)


    return render(request, 'cupons.html', {'lista': produtos, 'venda': pedido})

<>Результат фильтра: <QuerySet [<Order: Order: 1>, <Order: Order: 2>]><>

Вместо получения записей заказа (pedido), вы можете получить продукты (produtos) клиента (cliente), или даже купоны (cupoms) продуктов (produtos), которые принадлежат клиенту (cliente). Для этого вы можете использовать values_list следующим образом:

cupoms_usado = Pedido.objects.filter(cliente=cliente).values_list("produto__cupom", flat=True)

Это объединит две таблицы (Pedido & Produto) и даст вам список купонов, которые были использованы клиентом. Затем вы можете просто проверить, есть ли купон из списка в списке использованных купонов.

{% if i.cupom in cupoms_usado %}

Примечание: Не забудьте передать cupoms_usado в ваш шаблон из связанного представления.

Вернуться на верх