Други, прошу помощи. Я навичок в джанго и нужна помощь.
Стоит небольшая задача. Мини-проект(аналог 1с): есть простецкая модель: Сотрудник, Устройство и Документ. Каждое устройство закупается по счету, для него соответственно есть номер счета. Что я хочу: если, по одному счету закупается 10 единиц техники, то чтоб можно было загрузить документ один раз, а не каждый раз его добавлять и к остальным 9 единицам техники ссылка на этот документ подтягивалась автоматически.
п.с. изначально пытался впихнуть все в 2 модели. И, если добавить документ при добавлении 1-го устройства счета xxx1, то при добавлении следующих единиц техники счета xxx1 ссылка добавляется автоматически, но так не пойдет. Т.к. устройства буду добавлять я, а документ будет добавлять бухгалтерия.
п.п.с. Хочу сделать так, чтоб ключ с таблицы Device на таблицу Document было поле number_account, а не id . Не судите строго, это буквально второй "проект" после блога)
from datetime import datetime
from django.db import models
from django.utils import timezone
from django.core.exceptions import ValidationError
from django.utils.translation import gettext_lazy as _
from django import forms
from django.core.validators import FileExtensionValidator
from django.conf import settings
# from phonenumber_field.modelfields import PhoneNumberField
#проверка на длину серии паспорта
def validators_serial(value):
if not value.isdigit():
raise forms.ValidationError(_("Серия паспорта должна состоять только из цифр"))
elif len(str(value)) != 4 :
raise forms.ValidationError(_('Серия пасорта должна состоять из 4 цифр'))
#проверка серии паспорта
def validators_number(value):
if not value.isdigit():
raise forms.ValidationError(_("Номер паспорта должен состоять только из цифр"))
elif len(str(value)) != 6 :
raise forms.ValidationError(_('Номер пасорта должен состоять из 6 цифр'))
#проверка внутреннего телефона на правильность ввода(должны быть только цифры)
def validators_number_phone(value):
if not value.isdigit():
raise forms.ValidationError(_("Номер телефона должен состоять только из цифр"))
def validators_FIO(value):
if not value.isalpha():
raise forms.ValidationError(_("Это поле должно содержать только алфавитные символы"))
class Person(models.Model):
DEPARTMENT_CHOICE = (
('manage', "Управление"),
('sekretary', "Секретариат"),
('buhgaltery' , "Бухгалтерия"),
('ekonom' , " Эконом.отдел"),
('legal' , "Правовой"),
('registration' , "Регистрации и сертификации"),
('commercial', "Коммерческий"),
("hr", "Управление персоналом"),
("tender" , "Тендерный"),
("warehouse", "Склад"),
("transport", "Транспортный"),
("logistics", "Логистика"),
("purchases", "Закупки"),
("security" , "Безопасность"),
("ahch", "АХЧ"),
("it", "IT"),
("production", "Производство")
)
first_name = models.CharField('Имя', max_length = 15, validators = [validators_FIO])
last_name = models.CharField('Фамилия', max_length = 15, validators = [validators_FIO])
middle_name = models.CharField('Отчество', blank = True, max_length = 15, validators = [validators_FIO])
department = models.CharField('Отдел', blank = True, max_length = 20, choices = DEPARTMENT_CHOICE)
amount_laptop = models.IntegerField(default=0)
amount_desktop = models.IntegerField(default=0)
amount_monitor = models.IntegerField(default=0)
amount_monoblock = models.IntegerField(default=0)
amount_ex_disk = models.IntegerField(default=0)
amount_flash = models.IntegerField(default=0)
date_add_person = models.DateTimeField('Дата добавление сотрудника в БД')
image = models.ImageField('Фото', upload_to = 'images/avatar/', blank=True)
serial_pasport = models.CharField('Серия паспорта', max_length = 4, default= '0000', validators=[validators_serial] )
number_pasport = models.CharField('Номер паспорта', max_length = 6, default= '000000', validators=[validators_number])
internal_number_phone = models.CharField('Внутренний номер телефона', max_length = 3, blank = True, validators = [validators_number_phone])
number_phone = models.CharField('Номер телефона', max_length = 11, blank = True, validators = [validators_number_phone] )
# number_phone = models.PhoneNumberField(blank = True)
date_birthday = models.DateField('Дата рождения', blank = False)
# Сохранение ФИО в нижнем регистре
def save(self, *args, **kwargs):
self.first_name = self.first_name.lower()
self.last_name = self.last_name.lower()
self.middle_name = self.middle_name.lower()
return super(Person, self).save(*args, **kwargs)
def __str__(self):
s = self.last_name + ' ' +self.first_name
return s
def display_number_phone(self):
num = self.number_phone
num = str('(%s)-%s-%s-%s' % (num[:1], num[1:4], num[4:6], num[6:8]))
return num
class Meta:
verbose_name='Сотрудник'
verbose_name_plural='Сотрудники'
class Device(models.Model):
DEVICE_CHOICE = (
("desktop","Стационарный компьютер"),
("laptop", "Ноутбук"),
("monoblock", "Моноблок"),
("monitor", "Монитор"),
("externaldisk", "Внешний жесткий диск"),
("flashdrive", "Флешка"),
)
person = models.ForeignKey(Person, null = True, blank = True, on_delete = models.SET_NULL)
device_type = models.CharField('Тип устройства',max_length = 15, choices = DEVICE_CHOICE )
model = models.CharField('Модель устройства',max_length = 25)
descriptions = models.TextField('Описание', null = True, blank = True)
serial_number = models.CharField('Серийный номер', max_length = 25)
number_account = models.CharField('Номер счета',max_length = 15, blank = True) # номер счета
provider = models.CharField('Поставщик', max_length = 15, null = True, blank = True)
cost = models.IntegerField('Стоимость(руб)', null = True, blank = True, default = 0)
def display_person(self):
person = self.person
person = str(person).split(' ')
return person[0][:1].upper()+person[0][1:]+' '+person[1][:1].upper() + person[1][1:]
def __str__(self):
return self.device_type +' '+ self.model
class Meta:
verbose_name='Устройство'
verbose_name_plural='Устройства'
class Document(models.Model):
number_account = models.ForeignKey(Device, related_name='hui', blank = True, null = True, on_delete = models.SET_NULL)
closed_document = models.FileField('Закрывающий документ', upload_to = 'documents/', blank = True, validators = [FileExtensionValidator(['pdf', 'jpg', 'docx'])])
class Meta:
verbose_name='Документ'
verbose_name_plural='Документы'
Updated 7 July 2021, 16:40 by mavrikVIII.