Как выполнить поиск по модели Django
Дано: id контракта (например 32812) получить из обьектов модели кредитной заявки (!!!) уникальные id производителей всех товаров, которые связаны с этим контрактом при выполнении постараться минимизировать обращение к базе данных
class Credit(models.Model):
"""
Кредитная заявка. Только один контракт но несколько товаров
"""
name_credit = models.TextField(max_length=200, verbose_name='name_credit',null=True)
contract = models.ForeignKey('Contract',
verbose_name='contract', related_name='contract', on_delete=models.CASCADE)
# product = models.ForeignKey('Product',
# verbose_name='product',
# related_name='product',
# on_delete=models.CASCADE)
date = models.DateField(verbose_name='date', blank=True, null=True)
def __str__(self):
return "%s" % self.name_credit
class Meta:
verbose_name = 'Кредитная заявка '
verbose_name_plural = 'Кредитные заявки'
class Contract(models.Model):
"""
Контракт связан с кредитной заявкой
"""
#product = models.ForeignKey('Product', on_delete=models.CASCADE, related_name='product', null=True)
contracts = models.TextField(max_length=200,
verbose_name='contracts')
date = models.DateField(verbose_name='date', blank=True, null=True)
credit = models.ForeignKey(Credit, on_delete=models.CASCADE, null=True, blank=True,related_name='credit')
manufacturer = models.ForeignKey('Manufacturer',
on_delete=models.CASCADE, null=True)
def __str__(self):
return "%s" % self.contracts
class Meta:
verbose_name = 'Контракт '
verbose_name_plural = 'Контракты'
class Product(models.Model):
"""
Товар имеет только одного производителя
"""
credit = models.ForeignKey(Credit, on_delete=models.CASCADE, null=True, blank=True)
products = models.TextField(max_length=100, verbose_name='products')
manufacturer = models.ForeignKey('Manufacturer',
on_delete=models.CASCADE, related_name='manufacturer', null=True, blank=True)
def __str__(self):
return "%s" % self.products
class Meta:
verbose_name = 'Товар'
verbose_name_plural = 'Товары'
class Manufacturer(models.Model):
"""
Производитель производит только один продукт
"""
name = models.TextField(max_length=200, verbose_name='name')
#product = models.ManyToManyField('Product', related_name='product')
def __str__(self):
return "%s" % self.name
class Meta:
verbose_name = 'Производитель'
verbose_name_plural = 'Производители'
что написать во вьюхе что бы найти id товара находящегося в контракте? Как я думаю. У меня есть id контракта наверное через форму как то сделать. что бы потом Id перехватить и вставить во вьюху. после чего ищем в кредитной заявке Id завода.. PLZ help
Ответы (2 шт):
Автор решения: asd
→ Ссылка
Как вариант простого поиска, попробуй
from django.db.models import Q
def search(request):
query = request.GET.get('query')
contracts = Contract.objects.filter(Q(credit.id__icontains=query) )
context = {
'query': query,
'contracts': contracts
}
return render(request, 'search.html', context)
Автор решения: Anton Balmakov
→ Ссылка
Я многое переделал. Именно в моделях.
from django.db import models
class Manufacturer(models.Model):
name = models.TextField(max_length=200, null=True)
def __str__(self):
return "%s" % self.name
class Meta:
verbose_name = "Производитель"
verbose_name_plural = "Производители"
class CreditBit(models.Model):
name = models.TextField(max_length=200, null=True)
contract = models.OneToOneField('Contract', on_delete=models.CASCADE, related_name="creditbits")
def __str__(self):
return "%s" % self.name
class Meta:
verbose_name = "Кредитная заявка"
verbose_name_plural = "Кредитные заявки"
class Product(models.Model):
name = models.TextField(max_length=200, null=True)
manufacturer = models.ForeignKey(Manufacturer, on_delete=models.CASCADE, related_name="products", null=True)
creditbit = models.ForeignKey('CreditBit', on_delete=models.CASCADE, related_name="products", null=True)
def __str__(self):
return "%s" % self.name
class Meta:
verbose_name = "Продукт"
verbose_name_plural = "Продукты"
class Contract(models.Model):
name = models.TextField(max_length=200, null=True)
def __str__(self):
return "%s" % self.name
class Meta:
verbose_name = "Контракт"
verbose_name_plural = "Контракты"
И после написал нужный запрос views.py
from django.shortcuts import render
from django.views import View
from .models import Contract, CreditBit
from .forms import IdForm
class MyView(View):
form = IdForm
def post(self, request):
form = IdForm(request.POST)
context_dict = {'form': self.form}
if form.is_valid():
contract_id = form.cleaned_data.get("contract_id")
creditbit = CreditBit.objects.filter(contract_id=contract_id).first()
if not creditbit:
return render(request, template_name="contract.html", context={'form': self.form})
list_ids = list(creditbit.products.all().distinct()
.values_list("manufacturer__pk", flat=True))
# Просто для души
list_names = list(creditbit.products.all().distinct()
.values_list("manufacturer__name", flat=True))
context_dict.update({'list_ids': list_ids, 'list_names': list_names})
return render(request, template_name="contract.html", context=context_dict)
def get(self, request):
return render(request, template_name="contract.html", context={'form': self.form})