Advertisement
Mochinov

Untitled

Aug 11th, 2021
1,188
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 8.84 KB | None | 0 0
  1. from datetime import datetime
  2.  
  3. from django.contrib.auth.base_user import AbstractBaseUser
  4. from django.contrib.auth.models import PermissionsMixin, UserManager
  5. from django.db import models
  6.  
  7.  
  8. class CustomUser(AbstractBaseUser, PermissionsMixin):
  9.     """Расширенный пользователь"""
  10.     username = models.CharField('Пользователь', max_length=25, unique=True)
  11.     email = models.EmailField('Email', unique=True)
  12.     date_joined = models.DateTimeField('Дата регистрации', auto_now_add=True)
  13.     is_active = models.BooleanField('is_active', default=True)
  14.     is_staff = models.BooleanField('is_staff', default=False)
  15.     user_photo = models.ImageField(upload_to='media/users_photos/', null=True, blank=True)
  16.  
  17.     objects = UserManager()
  18.  
  19.     USERNAME_FIELD = 'username'
  20.     REQUIRED_FIELDS = []
  21.  
  22.     class Meta:
  23.         db_table = 'user'
  24.         verbose_name = 'Пользователь'
  25.         verbose_name_plural = 'Пользователи'
  26.  
  27.  
  28. class Product(models.Model):
  29.     """Продукт"""
  30.  
  31.     class Colors(models.TextChoices):
  32.         RED = 'RED', 'Красный'
  33.         TOMATO = 'TOMATO', 'Томатный'
  34.         GREEN = 'GREEN', 'Зеленый'
  35.         AQUA = 'AQUA', 'Аква'
  36.         VIOLET = 'VIOLET', 'Фиолетовый'
  37.         WHITE = 'WHITE', 'Белый'
  38.         BLACK = 'BLACK', 'Нигерский'
  39.         DEFAULT = 'DEFAULT', 'По умолчанию'
  40.  
  41.     name = models.CharField('Название', max_length=150)
  42.     description = models.TextField('Описание', max_length=500)
  43.     preview = models.ImageField(upload_to='media/products/', null=True, blank=True)
  44.     price = models.PositiveSmallIntegerField('Цена', default=0)
  45.     color = models.CharField('Цвета', choices=Colors.choices, default=Colors.DEFAULT)
  46.     characteristics = models.ForeignKey(
  47.         'Characteristic', on_delete=models.SET_NULL, null=True, blank=True, verbose_name='Характеристики'
  48.     )
  49.     url = models.SlugField('Ссылка', max_length=250, unique=True)
  50.  
  51.     def __str__(self):
  52.         return self.name
  53.     #Добавить метод get_abs_url см в гугле
  54.     class Meta:
  55.         db_table = 'product'
  56.         verbose_name = 'Продукт'
  57.         verbose_name_plural = 'Продукты'
  58.  
  59.  
  60. class ProductImages(models.Model):
  61.     """Изображения продукта"""
  62.     image = models.ImageField(upload_to='media/products/') # Тут будут храниться все фото , отфильтруй по папкам
  63.     # Можно добавить name или description для фото
  64.     product = models.ForeignKey(Product, on_delete=models.CASCADE, verbose_name='Продукт')
  65.  
  66.     class Meta:
  67.         db_table = 'product_images'
  68.         verbose_name = 'Изображение'
  69.         verbose_name_plural = 'Изображения'
  70.  
  71.  
  72. class ProductReview(models.Model):
  73.     """Отзывы к продукту"""
  74.     customer = models.ForeignKey(CustomUser, on_delete=models.CASCADE, blank=True, verbose_name='Покупатель')
  75.     product = models.ForeignKey(Product, on_delete=models.CASCADE, verbose_name='Продукт')
  76.     text = models.TextField('Отзыв', max_length=250)
  77.     # Я бы сделал тут не Fk а ContentType, Но не критично
  78.     parent = models.ForeignKey(
  79.         'self', on_delete=models.SET_NULL, null=True, blank=True, verbose_name='Родительский отзыв'
  80.     )
  81.  
  82.     def __str__(self):
  83.         return f'{self.customer} - {self.text}'
  84.  
  85.     class Meta:
  86.         db_table = 'product_review'
  87.         verbose_name = 'Отзыв к продукту'
  88.         verbose_name_plural = 'Отзывы к продукту'
  89.  
  90.  
  91. class RatingStar(models.Model):
  92.     """Звезда рейтинга"""
  93.     value = models.PositiveSmallIntegerField('Значение', default=0)
  94.  
  95.     def __str__(self):
  96.         return self.value
  97.  
  98.     class Meta:
  99.         db_table = 'rating_star'
  100.         verbose_name = 'Звезда рейтинга'
  101.         verbose_name_plural = 'Звёзды рейтинга'
  102.  
  103.  
  104. class Rating(models.Model):
  105.     """Рейтинг"""
  106.     customer = models.ForeignKey(
  107.         CustomUser, on_delete=models.SET_NULL, null=True, blank=True, verbose_name='Покупатель'
  108.     )
  109.     star = models.ForeignKey(RatingStar, on_delete=models.CASCADE, verbose_name='Звезда')
  110.     product = models.ForeignKey(Product, on_delete=models.CASCADE, verbose_name='Продукт')
  111.  
  112.     def __str__(self):
  113.         return f'{self.customer} - {self.star}'
  114.  
  115.     class Meta:
  116.         db_table = 'rating'
  117.         verbose_name = 'Рейтинг'
  118.         verbose_name_plural = 'Рейтинг'
  119.  
  120.  
  121. class Characteristic(models.Model):
  122.     """Характеристики"""
  123.  
  124.     class CompositionType(models.TextChoices):
  125.         STEEL = 'STEEL', 'Сталь'
  126.         IRON = 'IRON', 'Железо'
  127.         ALUMINIUM = 'ALUMINIUM', 'Алюминий'
  128.         CAST_IRON = 'CAST_IRON', 'Чугун'
  129.         POLYESTER = 'POLYESTER', 'Полиэстер'
  130.         PLA = 'PLA', 'PLA'
  131.         ABS = 'ABS', 'ABS'
  132.         PETG = 'PETG', 'PETG'
  133.  
  134.     weight = models.PositiveSmallIntegerField('Вес', default=0)
  135.     material = models.CharField('Материал', choices=CompositionType.choices, default=CompositionType.PLA)
  136.  
  137.     def __str__(self):
  138.         return f'{self.material} - {self.weight}'
  139.  
  140.     class Meta:
  141.         db_table = 'characteristic'
  142.         verbose_name = 'Характеристика'
  143.         verbose_name_plural = 'Характеристики'
  144.  
  145.  
  146. class Customer(models.Model):
  147.     """Покупатель"""
  148.     user = models.ForeignKey(CustomUser, on_delete=models.CASCADE)
  149.     # Где поля адреса фио и тд ???
  150.     # Тут должна быть сылка на adress
  151.     def __str__(self):
  152.         return self.user.username
  153.  
  154.     class Meta:
  155.         db_table = 'customer'
  156.         verbose_name = 'Покупатель'
  157.         verbose_name_plural = 'Покупатели'
  158.  
  159.  
  160. class Order(models.Model):
  161.     """Заказ"""
  162.  
  163.     class Statuses(models.TextChoices):
  164.         IN_PROCESSING = 'IN_PROCESSING', 'В обработке'
  165.         ACCEPTED = 'ACCEPTED', 'Принята'
  166.         PREPARED_FOR_SHIPMENT = 'PREPARED_FOR_SHIPMENT', 'Подготовлено к отправке'
  167.         SENT = 'SENT', 'Отправлено',
  168.         DELIVERED = 'DELIVERED', 'Доставлено'
  169.         COMPLETED = 'COMPLETED', 'Завершен'
  170.  
  171.     product = models.ForeignKey(Product, on_delete=models.SET_NULL, null=True, verbose_name='Продукт')
  172.     user = models.ForeignKey(CustomUser, on_delete=models.CASCADE, verbose_name='Заказчик')
  173.     date = models.DateTimeField('Дата заказа', default=datetime.now())
  174.     count = models.SmallIntegerField('Количество', default=1)
  175.     status = models.CharField('Статус', choices=Statuses.choices, default=Statuses.IN_PROCESSING)
  176.  
  177.     def __str__(self):
  178.         return f'{self.product} - {self.date} - {self.count} - {self.status}'
  179.  
  180.     class Meta:
  181.         db_table = 'order'
  182.         verbose_name = 'Заказ'
  183.         verbose_name_plural = 'Заказы'
  184.  
  185.  
  186. class Address(models.Model):
  187.     """Адрес"""
  188.     user = models.ForeignKey(CustomUser, on_delete=models.CASCADE, verbose_name='Пользователь') # Не верно !!!!! Адрес должен быть у пациента , но не у адрема есть пациент
  189.     recipient = models.CharField('Получатель', max_length=250)
  190.     phone = models.CharField('Номер телефона', max_length=50)
  191.     country = models.CharField('Страна', max_length=150)
  192.     city = models.CharField('Город', max_length=150)
  193.     location = models.CharField('Дом, кв', max_length=250)
  194.     zip = models.CharField('Почтовый индекс', max_length=25)
  195.  
  196.     def __str__(self):
  197.         return f'{self.country}-{self.city}-{self.location}'
  198.  
  199.     class Meta:
  200.         db_table = 'address'
  201.         verbose_name = 'Адрес'
  202.         verbose_name_plural = 'Адреса'
  203.  
  204.  
  205. class Post(models.Model):
  206.     """Пост"""
  207.     title = models.CharField('Заголовок', max_length=250)
  208.     author = models.ForeignKey(CustomUser, on_delete=models.CASCADE, verbose_name='Автор')
  209.     preview = models.ImageField('Превью', upload_to='media/post_previews/')
  210.     publish_date = models.DateTimeField('Дата публикации', default=datetime.now())
  211.     tags = models.ManyToManyField('Tag', verbose_name='теги')
  212.     text = models.TextField('Текст', max_length=1000)
  213.  
  214.     def __str__(self):
  215.         return self.title
  216.  
  217.     class Meta:
  218.         db_table = 'post'
  219.         verbose_name = 'Пост'
  220.         verbose_name_plural = 'Посты'
  221.  
  222.  
  223. class Tag(models.Model):
  224.     name = models.CharField('Тег', max_length=25)
  225.     url = models.SlugField('Ссылка', max_length=250, unique=True)
  226.  
  227.     def __str__(self):
  228.         return self.name
  229.  
  230.     class Meta:
  231.         db_table = 'tag'
  232.         verbose_name = 'Тег'
  233.         verbose_name_plural = 'Теги'
  234.  
  235.  
  236. class PostReview(models.Model):
  237.     user = models.ForeignKey(CustomUser, on_delete=models.SET_NULL, null=True, blank=True, verbose_name='Пользователь')
  238.     name = models.CharField('Имя', max_length=50)
  239.     email = models.EmailField('Email', unique=True)
  240.     text = models.TextField('Текст', max_length=500)
  241.     post = models.ForeignKey(Post, on_delete=models.CASCADE, verbose_name='Пост')
  242.  
  243.     def __str__(self):
  244.         return f'{self.name} - {self.post}'
  245.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement