Как фильтровать отношения между несколькими моделями?Python

Программы на Python
Anonymous
Как фильтровать отношения между несколькими моделями?

Сообщение Anonymous »

Мои модели:

Код: Выделить всё

class Order (models.Model):
customer = models.ForeignKey("Customer", on_delete=models.RESTRICT)
request_date = models.DateField()
price = models.DecimalField(max_digits=10, decimal_places=2)

@property
def agent_name(self):
assignment = Assignment.objects.get(assig_year = self.request_date.year, customer = self.customer)
if assignment is not None:
return assignment.sales_agent.name + ' ' + assignment.sales_agent.surname
else:
return 'ERROR'

class Company (models.Model):
pass

class Customer (Company):
pass

class Assignment (models.Model):
assig_year = models.PositiveSmallIntegerField()
customer = models.ForeignKey("Customer", on_delete=models.CASCADE)
sales_agent = models.ForeignKey("Agent", on_delete=models.CASCADE)

class Meta:
#unique key year + customer
constraints = [
UniqueConstraint(
fields=['assig_year', 'customer'], name='Primary_Key_Assignment'
)
]

class Employee (models.Model):
name = models.CharField(max_length=32)
surname = models.CharField(max_length=32)

class Agent (Employee):
pass
Одно задание связывает каждого клиента с торговым агентом за определенный год. У каждого клиента может быть несколько заказов в течение года, и за обслуживание всех из них отвечает агент, закрепленный за клиентом. В одном из представлений я показываю все заказы, указывая соответствующего агента по продажам, клиента, дату и цену:

Код: Выделить всё

def GetOrders(request):
orders = Order.objects.order_by('-request_date')

template = loader.get_template('orders.html')
context = {
'orders' : orders,
}
return HttpResponse(template.render(context,request))
orders.html:

Код: Выделить всё









Agent
Customer
Date
Price


{% for x in orders %}
{{ x.agent_name }}
{{ x.customer.name }}
{{ x.request_date }}
{{ x.price }}

{% endfor %}





Я хочу добавить возможность фильтрации для выбора интересующего меня торгового агента. Я не знаю, как работать с отношениями, чтобы проверить торгового агента. Я попробовал свойство Agent_name:

Код: Выделить всё











Agent:


Filter







Agent
Customer
Date
Price


{% for x in orders %}
{{ x.agent_name }}
{{ x.customer.name }}
{{ x.request_date }}
{{ x.price }}

{% endfor %}





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

Код: Выделить всё

def GetOrders(request):
orders = Order.objects.order_by('-request_date')

com = request.GET.get('name')
if com != '' and com is not None:
orders = orders.filter(Q(agent_name__icontains=com))

template = loader.get_template('orders.html')
context = {
'orders' : orders,
}
return HttpResponse(template.render(context,request))
Но я не могу использовать его в качестве критерия фильтра, поскольку это не настоящее поле модели, и я получаю FieldError:

Невозможно преобразовать ключевое слово «agent_name» в поле


Подробнее здесь: https://stackoverflow.com/questions/789 ... ationships

Вернуться в «Python»