Задать вопрос
@armageddon234

Как правильно реализовать идею Django?

У меня есть две модели:

from django.db import models
from django.contrib.auth.models import AbstractUser
from django.conf import settings
from django.utils.text import slugify

class User(AbstractUser):
    ROLE_CHOICES = (
        ('employee', 'Сотрудник'),
        ('admin', 'Админ'),
    )

    role = models.CharField(max_length=20, choices=ROLE_CHOICES, default='employee', verbose_name='Роль')

    workshop = models.IntegerField(verbose_name='Цех', null=True, blank=True, editable=False)
    department = models.IntegerField(verbose_name='Отдел', null=True, blank=True, editable=False)

    def __str__(self):
        return f'{self.first_name} {self.last_name}'

class Device(models.Model):
    inventory_number = models.CharField(
        max_length=50, verbose_name='Инвентарный номер',
        unique=True, null=True, blank=True,
        editable=False
    )

    workshop = models.IntegerField(verbose_name='Цех')
    department = models.IntegerField(verbose_name='Отдел')

    number_computer = models.IntegerField(
        verbose_name='Номер ПК в отделе',
        editable=False, default=0
    )


    def __str__(self):
        return self.inventory_number if self.inventory_number else f'Новое устройство (Цех: {self.workshop}, Отдел: {self.department})'


    def save(self, *args, **kwargs):
        if not self.pk or not self.inventory_number:
            last_device_in_department = Device.objects.filter(
                workshop=self.workshop,
                department=self.department
            ).order_by('-number_computer').first()

            if last_device_in_department:
                self.number_computer = last_device_in_department.number_computer + 1
            else:
                self.number_computer = 1

            workshop_str = f"{self.workshop:02d}"
            department_str = f"{self.department:03d}"
            pc_number_str = f"{self.number_computer:02d}"

            self.inventory_number = f"PC{workshop_str}_{department_str}_{pc_number_str}"

            super().save(*args, **kwargs)



    class Meta:
        verbose_name = 'Оборудование'
        verbose_name_plural = 'Оборудование'

        unique_together = ('workshop', 'department', 'number_computer')
        ordering = ['workshop', 'department', 'number_computer']

и еще реализована админка, но только для Device:

from django.contrib import admin
from django.contrib.auth.admin import UserAdmin as BaseUserAdmin
from .models import User, Device, Incident, ComponentOrder
# Register your models here.



@admin.register(Device)
class DeviceAdmin(admin.ModelAdmin):
    list_display = ('inventory_number', 'user', 'workshop', 'department', 'number_computer')
    list_filter = ('workshop', 'department')
    search_fields = ('inventory_number', 'user__username', 'user__first_name', 'user__lastname')
    readonly_fields = ('inventory_number', 'number_computer')

    def get_fieldsets(self, request, obj=None):
        if not obj:  # Форма создания
            return (
                (None, {'fields': ('user', 'workshop', 'department')}),
            )
        return super().get_fieldsets(request, obj)

С девайсом все хорошо, Сам создается инвентарный номер с помощью цеха и отдела в функции save.

Что я хочу сделать, но не могу понять?

В девайсе будет выбор User, но он останется пустым, то есть null И blank true, будет заполнен цех, отдел, ну и инвентарный номер который сгенерировался сам.

Дальше при создании User. Я все ввожу, данные которые нужны и выбираю device. и создаю. Поэтому device заполняется user.inventory_number, от этого инвентарного номера в user создается login, который просто копирует этот инвентарный номер, ну и самое ГЛАВНОЕ, чтобы после создания user, получается в таблице device автоматически выбрался тот User, которому соответствует инвентарный номер. Как это реализовать, и как правильно реализовать админку для User?
  • Вопрос задан
  • 46 просмотров
Подписаться 1 Простой Комментировать
Решения вопроса 1
@Everything_is_bad
у тебя проблема с проектирование, зачем все это дублирование workshop, department когда можно сделать ForeignKey на в Device на User или наоборот, как именно звучит эта связь в ТЗ? Либо вообще требуется таблица со структурой предприятия.

а super().save вообще под условием, если условия не выполнено, сохранения не будет, это вообще треш

два значения inventory_number и number_computer без описания из ТЗ, какое-то сомнительное и непонятное действие.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы