Можно ли изменить неотображаемые поля модели Django во время проверки пользовательской формы, но перед фиксацией данных Python

Программы на Python
Anonymous
Можно ли изменить неотображаемые поля модели Django во время проверки пользовательской формы, но перед фиксацией данных

Сообщение Anonymous »

Последние несколько недель я работал над своим первым проектом Django: базой данных для регистрации всех входящих заказов от клиентов для общего предприятия. Предположим, что каждый торговый представитель может быть закреплен за конкретным клиентом на целый год, и назначения могут меняться от одного года к другому (т. е. агент А назначен клиенту А в 2024 году, тогда как в 2025 году агент Б может находиться в ответственность клиента A).
Для начала я решил использовать модель FK внутри заказов для ссылки на связанный продукт и клиента. В то же время модель «Назначения» также сохраняла бы пару FK для таблиц «Клиент» и «Агент», поэтому в моей реляционной диаграмме все могло быть связано, доступно и можно было избежать циклов данных. Тем не менее, это решение было очень болезненным для получения некоторых данных, особенно когда мне нужно было получить отфильтрованные данные для окончательных шаблонов... поэтому я решил перевернуть все с ног на голову и использовать другой подход:

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

class Order (models.Model):
assignment = models.ForeignKey("Assignment", on_delete=models.RESTRICT)
product = models.ForeignKey("Product", on_delete=models.RESTRICT)
quantity = models.PositiveIntegerField(default=1)
order_date = models.DateField()
price = models.DecimalField(max_digits=10, decimal_places=2)

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

class Meta:
constraints = [
UniqueConstraint(
fields=['year', 'customer'], name='Primary_Key_Assignment'
)
]

class Customer (models.Model):
name = models.CharField(max_length=64)
address = models.CharField(max_length=64)
city = models.CharField(max_length=32)
working_time_start = models.TimeField(blank=True, null=True)
working_time_end = models.TimeField(blank=True, null=True)

class Meta:
verbose_name_plural = "Customers"
constraints = [
CheckConstraint(
check = Q(working_time_start__isnull=True, working_time_end__isnull=True)|Q(working_time_start__isnull=False, working_time_end__isnull=False, working_time_start__lte=F('working_time_end')),
name = 'Wrong working time limits',
),
]
Итак, заказы теперь напрямую ссылаются на конкретные задания, и я признаю, что у этого есть некоторые плюсы и минусы, и меня не совсем устраивает тот факт, что год задания и дата заказа путаются. в одной таблице из-за дублирования и потенциальных несоответствий.
Сказав это, я предпочитаю скрыть все эти сложные детали от пользователя и хотел бы иметь представление администратора для заказов, которые может скрыть поле назначения FK, но при этом позволит пользователю выбрать идентификатор клиента. После этого я выбирал идентификатор клиента, год на основе даты заказа и создавал действительное назначение FK, прежде чем регистр можно было сохранить в базе данных.
Что-то вроде следующего:< /p>

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

from django.contrib import admin
from django.db.models import F, CharField
from django import forms
from django.db import models
from .models import Customer, Agent, Product, Order, Assignment

class OrderForm(forms.ModelForm):

customers_list = forms.ModelChoiceField(queryset = Customer.objects.all())

def clean(self):
cleaned_data = self.cleaned_data

form_date = cleaned_data['order_date']
customer_form = cleaned_data['customers_list']
cleaned_data['assignment'] = Assignment.objects.get(assignment_year=form_date.year, customer=customer_form.id)

super(OrderForm, self).clean()

return cleaned_data

class Meta:
model = Order
fields = '__all__'

class OrderAdmin(admin.ModelAdmin):
form = OrderForm
fieldsets = (
('None', {
'fields': ( 'customers_list', 'product', 'quantity', 'order_date', 'price', )
}),
)

admin.site.register(Order, OrderAdmin)
Метод очистки, представленный выше, жалуется, потому что я не включаю назначение FK в форму, поэтому я не могу изменить его перед началом проверки на уровне модели (например, CheckConstraints, настраиваемый метод очистки и сохранения модели). , если таковые имеются и т. д.).
Итак, мой вопрос: есть ли способ построить действительную модель заказа на основе входных данных, полученных из пользовательской формы заказа, и добавить свое ожидающее задание как действительный FK до того, как регистр будет вставлен в базу данных, даже если пользователю не отображается никакое назначение?

Подробнее здесь: https://stackoverflow.com/questions/788 ... rm-validat

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