Advertisement
Mochinov

Untitled

Aug 11th, 2021
319
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 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