/
Demek
/
DSam621
Обзор
Документация
Войти
/
Demek
/
DSam621
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
main
Python/archaeology_project/apps/core/models.py
322 строки
18 KB
d_e_m_e_k
еще одно видение проекта по археологии
12 авг 2026, 11:31
12 авг 2026, 11:31
8c2f6c8
Код
Авторство
О чём код?
from django.db import models from django.core.validators import MinValueValidator from django.contrib.auth.models import User from django.db.models import Q class Excavation(models.Model): """Модель раскопа""" name = models.CharField('Название раскопа', max_length=100, unique=True) description = models.TextField('Описание', blank=True) location = models.CharField('Местоположение', max_length=200, blank=True) start_date = models.DateField('Дата начала', null=True, blank=True) end_date = models.DateField('Дата окончания', null=True, blank=True) created_by = models.ForeignKey(User, on_delete=models.SET_NULL, null=True, related_name='excavations') created_at = models.DateTimeField('Дата создания', auto_now_add=True) updated_at = models.DateTimeField('Дата обновления', auto_now=True) class Meta: verbose_name = 'Раскоп' verbose_name_plural = 'Раскопы' ordering = ['-created_at'] def __str__(self): return self.name @property def total_pits(self): return sum(square.pits.count() for square in self.squares.all()) class Square(models.Model): """Модель квадрата""" excavation = models.ForeignKey(Excavation, on_delete=models.CASCADE, related_name='squares') name = models.CharField('Название квадрата', max_length=50) size = models.CharField('Размер', max_length=20, blank=True) description = models.TextField('Описание', blank=True) created_at = models.DateTimeField('Дата создания', auto_now_add=True) class Meta: verbose_name = 'Квадрат' verbose_name_plural = 'Квадраты' unique_together = ['excavation', 'name'] ordering = ['name'] def __str__(self): return f"{self.excavation.name} - {self.name}" class Pit(models.Model): """Модель ямы""" square = models.ForeignKey(Square, on_delete=models.CASCADE, related_name='pits') name = models.CharField('Название ямы', max_length=50) description = models.TextField('Описание', blank=True) depth = models.FloatField('Глубина (м)', null=True, blank=True) created_at = models.DateTimeField('Дата создания', auto_now_add=True) class Meta: verbose_name = 'Яма' verbose_name_plural = 'Ямы' unique_together = ['square', 'name'] ordering = ['name'] def __str__(self): return f"{self.square.excavation.name} - {self.square.name} - {self.name}" @property def full_name(self): return f"{self.square.excavation.name} - {self.square.name} - {self.name}" class LepnayaCeramics(models.Model): """Модель лепной керамики""" COLOR_CHOICES = [ ('red_coarse', 'красно-гл с крупной примесью дресвы'), ('gray_coarse', 'серо-гл с крупной примесью дресвы'), ('black_coarse', 'черная с дресвой (нагар)'), ('red_quality', 'красно-гл с крупной примесью дресвы (кач)'), ('gray_quality', 'серо-гл с крупной примесью дресвы (кач)'), ('polished', 'лощеная с мелкой примесью'), ] pit = models.ForeignKey(Pit, on_delete=models.CASCADE, related_name='lepnaya_ceramics') color_type = models.CharField('Тип/цвет', max_length=50, choices=COLOR_CHOICES, db_index=True) walls_thin = models.IntegerField('Стенки тонкие', default=0, validators=[MinValueValidator(0)]) walls_thick = models.IntegerField('Стенки толстые', default=0, validators=[MinValueValidator(0)]) rims_simple = models.IntegerField('Венчики простые', default=0, validators=[MinValueValidator(0)]) rims_profiled = models.IntegerField('Венчики профилированные', default=0, validators=[MinValueValidator(0)]) rims_nail = models.IntegerField('Венчики ногтев./веревочн.', default=0, validators=[MinValueValidator(0)]) rims_rope = models.IntegerField('Венчики веревочн.', default=0, validators=[MinValueValidator(0)]) bottoms = models.IntegerField('Донца', default=0, validators=[MinValueValidator(0)]) count = models.IntegerField('Количество', default=0, validators=[MinValueValidator(0)]) weight = models.FloatField('Вес (г)', default=0.0, validators=[MinValueValidator(0)]) ornament_linear = models.IntegerField('Лин./борозч./рифл', default=0, validators=[MinValueValidator(0)]) ornament_wave = models.IntegerField('Волн./зигзаг', default=0, validators=[MinValueValidator(0)]) ornament_nail = models.IntegerField('Ноготь', default=0, validators=[MinValueValidator(0)]) ornament_rope = models.IntegerField('Веревка', default=0, validators=[MinValueValidator(0)]) ornament_stamp = models.IntegerField('Штамп', default=0, validators=[MinValueValidator(0)]) ornament_combined = models.IntegerField('Комбинированный', default=0, validators=[MinValueValidator(0)]) created_at = models.DateTimeField('Дата создания', auto_now_add=True) updated_at = models.DateTimeField('Дата обновления', auto_now=True) class Meta: verbose_name = 'Лепная керамика' verbose_name_plural = 'Лепная керамика' unique_together = ['pit', 'color_type'] ordering = ['pit', 'color_type'] indexes = [ models.Index(fields=['pit', 'color_type']), ] def __str__(self): return f"{self.pit} - {self.get_color_type_display()}" @property def total_ornament(self): return (self.ornament_linear + self.ornament_wave + self.ornament_nail + self.ornament_rope + self.ornament_stamp + self.ornament_combined) class EarlyCircularCeramics(models.Model): """Модель раннекруговой керамики""" COLOR_CHOICES = [ ('red_dresva', 'красно-гл с дресвой'), ('red_white', 'красно-гл с дресвой и белесой поверхн'), ('white_dresva', 'бело-гл с дресвой (ангоб, лимонит)'), ('gray_dresva', 'серо/желто-гл с дресвой'), ('black_dresva', 'черная с дресвой (нагар)'), ('fired', 'обожженая, ошлакованная'), ] pit = models.ForeignKey(Pit, on_delete=models.CASCADE, related_name='early_circular_ceramics') color_type = models.CharField('Тип/цвет', max_length=50, choices=COLOR_CHOICES, db_index=True) walls_thin = models.IntegerField('Стенки тонкие', default=0, validators=[MinValueValidator(0)]) walls_thick = models.IntegerField('Стенки толстые', default=0, validators=[MinValueValidator(0)]) rim_v0 = models.IntegerField('Венчик В0', default=0, validators=[MinValueValidator(0)]) rim_v1 = models.IntegerField('Венчик В1', default=0, validators=[MinValueValidator(0)]) rim_v2 = models.IntegerField('Венчик В2', default=0, validators=[MinValueValidator(0)]) rim_v4 = models.IntegerField('Венчик В4', default=0, validators=[MinValueValidator(0)]) rim_vq = models.IntegerField('Венчик В?', default=0, validators=[MinValueValidator(0)]) rim_bowls = models.IntegerField('Миски', default=0, validators=[MinValueValidator(0)]) rim_other = models.IntegerField('Прочие', default=0, validators=[MinValueValidator(0)]) bottoms_without = models.IntegerField('Донца без подсып.', default=0, validators=[MinValueValidator(0)]) bottoms_with = models.IntegerField('Донца с подсып.', default=0, validators=[MinValueValidator(0)]) stamp = models.IntegerField('Клеймо', default=0, validators=[MinValueValidator(0)]) count = models.IntegerField('Количество', default=0, validators=[MinValueValidator(0)]) weight = models.FloatField('Вес (г)', default=0.0, validators=[MinValueValidator(0)]) ornament_linear = models.IntegerField('Лин./борозч./рифл', default=0, validators=[MinValueValidator(0)]) ornament_wave = models.IntegerField('Волн./зигзаг', default=0, validators=[MinValueValidator(0)]) ornament_nail = models.IntegerField('Ноготь', default=0, validators=[MinValueValidator(0)]) ornament_rope = models.IntegerField('Веревка', default=0, validators=[MinValueValidator(0)]) ornament_stamp = models.IntegerField('Штамп', default=0, validators=[MinValueValidator(0)]) ornament_combined = models.IntegerField('Комбинированный', default=0, validators=[MinValueValidator(0)]) created_at = models.DateTimeField('Дата создания', auto_now_add=True) updated_at = models.DateTimeField('Дата обновления', auto_now=True) class Meta: verbose_name = 'Раннекруговая керамика' verbose_name_plural = 'Раннекруговая керамика' unique_together = ['pit', 'color_type'] ordering = ['pit', 'color_type'] indexes = [ models.Index(fields=['pit', 'color_type']), ] def __str__(self): return f"{self.pit} - {self.get_color_type_display()}" @property def total_ornament(self): return (self.ornament_linear + self.ornament_wave + self.ornament_nail + self.ornament_rope + self.ornament_stamp + self.ornament_combined) class DevelopedCircularCeramics(models.Model): """Модель развитой круговой керамики""" COLOR_CHOICES = [ ('red_sand', 'красно-гл с песком'), ('red_no_impurity', 'красно-гл без видим. примесей'), ('white_sand', 'бело-гл с песком'), ('white_no_impurity', 'бело-гл без видим. примесей'), ] pit = models.ForeignKey(Pit, on_delete=models.CASCADE, related_name='developed_circular_ceramics') color_type = models.CharField('Тип/цвет', max_length=50, choices=COLOR_CHOICES, db_index=True) walls_thin = models.IntegerField('Стенки тонкие', default=0, validators=[MinValueValidator(0)]) walls_thick = models.IntegerField('Стенки толстые', default=0, validators=[MinValueValidator(0)]) rim_v0 = models.IntegerField('Венчик В0', default=0, validators=[MinValueValidator(0)]) rim_v1 = models.IntegerField('Венчик В1', default=0, validators=[MinValueValidator(0)]) rim_v3 = models.IntegerField('Венчик В3', default=0, validators=[MinValueValidator(0)]) rim_v4 = models.IntegerField('Венчик В4', default=0, validators=[MinValueValidator(0)]) rim_vq = models.IntegerField('Венчик В?', default=0, validators=[MinValueValidator(0)]) rim_bowls = models.IntegerField('Миски', default=0, validators=[MinValueValidator(0)]) rim_other = models.IntegerField('Прочие', default=0, validators=[MinValueValidator(0)]) bottoms_without = models.IntegerField('Донца без подсып.', default=0, validators=[MinValueValidator(0)]) bottoms_with = models.IntegerField('Донца с подсып.', default=0, validators=[MinValueValidator(0)]) stamp = models.IntegerField('Клеймо', default=0, validators=[MinValueValidator(0)]) count = models.IntegerField('Количество', default=0, validators=[MinValueValidator(0)]) weight = models.FloatField('Вес (г)', default=0.0, validators=[MinValueValidator(0)]) ornament_linear = models.IntegerField('Лин./борозч./рифл', default=0, validators=[MinValueValidator(0)]) ornament_wave = models.IntegerField('Волн./зигзаг', default=0, validators=[MinValueValidator(0)]) ornament_nail = models.IntegerField('Ноготь', default=0, validators=[MinValueValidator(0)]) ornament_rope = models.IntegerField('Веревка', default=0, validators=[MinValueValidator(0)]) ornament_stamp = models.IntegerField('Штамп', default=0, validators=[MinValueValidator(0)]) ornament_combined = models.IntegerField('Комбинированный', default=0, validators=[MinValueValidator(0)]) created_at = models.DateTimeField('Дата создания', auto_now_add=True) updated_at = models.DateTimeField('Дата обновления', auto_now=True) class Meta: verbose_name = 'Развитая круговая керамика' verbose_name_plural = 'Развитая круговая керамика' unique_together = ['pit', 'color_type'] ordering = ['pit', 'color_type'] indexes = [ models.Index(fields=['pit', 'color_type']), ] def __str__(self): return f"{self.pit} - {self.get_color_type_display()}" @property def total_ornament(self): return (self.ornament_linear + self.ornament_wave + self.ornament_nail + self.ornament_rope + self.ornament_stamp + self.ornament_combined) class LateCircularCeramics(models.Model): """Модель поздней круговой керамики""" COLOR_CHOICES = [ ('red', 'красно-гл'), ('gray', 'серая'), ('white', 'бело-гл'), ('black', 'черная (нагар)'), ] pit = models.ForeignKey(Pit, on_delete=models.CASCADE, related_name='late_circular_ceramics') color_type = models.CharField('Тип/цвет', max_length=50, choices=COLOR_CHOICES, db_index=True) walls_thin = models.IntegerField('Стенки тонкие', default=0, validators=[MinValueValidator(0)]) walls_thick = models.IntegerField('Стенки толстые', default=0, validators=[MinValueValidator(0)]) rim_v10 = models.IntegerField('Венчик в10', default=0, validators=[MinValueValidator(0)]) rim_v11 = models.IntegerField('Венчик в11', default=0, validators=[MinValueValidator(0)]) handles = models.IntegerField('Ручки', default=0, validators=[MinValueValidator(0)]) bottoms_without = models.IntegerField('Донца без подсып.', default=0, validators=[MinValueValidator(0)]) bottoms_with = models.IntegerField('Донца с подсып.', default=0, validators=[MinValueValidator(0)]) stamp = models.IntegerField('Клеймо', default=0, validators=[MinValueValidator(0)]) count = models.IntegerField('Количество', default=0, validators=[MinValueValidator(0)]) weight = models.FloatField('Вес (г)', default=0.0, validators=[MinValueValidator(0)]) ornament_linear = models.IntegerField('Лин./борозч./рифл', default=0, validators=[MinValueValidator(0)]) ornament_wave = models.IntegerField('Волн./зигзаг', default=0, validators=[MinValueValidator(0)]) ornament_nail = models.IntegerField('Ноготь', default=0, validators=[MinValueValidator(0)]) ornament_rope = models.IntegerField('Веревка', default=0, validators=[MinValueValidator(0)]) ornament_glaze = models.IntegerField('Глазурь', default=0, validators=[MinValueValidator(0)]) ornament_combined = models.IntegerField('Комбинированный', default=0, validators=[MinValueValidator(0)]) created_at = models.DateTimeField('Дата создания', auto_now_add=True) updated_at = models.DateTimeField('Дата обновления', auto_now=True) class Meta: verbose_name = 'Поздняя круговая керамика' verbose_name_plural = 'Поздняя круговая керамика' unique_together = ['pit', 'color_type'] ordering = ['pit', 'color_type'] indexes = [ models.Index(fields=['pit', 'color_type']), ] def __str__(self): return f"{self.pit} - {self.get_color_type_display()}" @property def total_ornament(self): return (self.ornament_linear + self.ornament_wave + self.ornament_nail + self.ornament_rope + self.ornament_glaze + self.ornament_combined) class UndefinedFragments(models.Model): """Модель неопределенных фрагментов""" COLOR_CHOICES = [ ('red', 'красно-гл'), ('gray', 'серо/желто-гл'), ('black', 'черные (нагар)'), ] FRAGMENT_CHOICES = [ ('печина', 'печина'), ('обмазка', 'обмазка'), ('шлак', 'шлак'), ('шлак_глиняный', 'шлак глиняный'), ('кальцинир', 'кальцинир.'), ('зубы', 'зубы'), ('прочие', 'прочие ф-ты'), ('сланец', 'сланец'), ] pit = models.ForeignKey(Pit, on_delete=models.CASCADE, related_name='undefined_fragments') color_type = models.CharField('Тип/цвет', max_length=50, choices=COLOR_CHOICES, db_index=True) fragment_type = models.CharField('Тип фрагмента', max_length=50, choices=FRAGMENT_CHOICES, db_index=True) count = models.IntegerField('Количество', default=0, validators=[MinValueValidator(0)]) weight = models.FloatField('Вес (г)', default=0.0, validators=[MinValueValidator(0)]) created_at = models.DateTimeField('Дата создания', auto_now_add=True) class Meta: verbose_name = 'Неопределенный фрагмент' verbose_name_plural = 'Неопределенные фрагменты' unique_together = ['pit', 'color_type', 'fragment_type'] ordering = ['pit', 'color_type', 'fragment_type'] indexes = [ models.Index(fields=['pit', 'color_type', 'fragment_type']), ] def __str__(self): return f"{self.pit} - {self.get_color_type_display()} - {self.get_fragment_type_display()}"