Для начала я решил использовать модель 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 до того, как регистр будет вставлен в базу данных, даже если пользователю не отображается никакое назначение?
Подробнее здесь: https://stackoverflow.com/questions/788 ... rm-validat