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})
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 в ваш шаблон из связанного представления.