Files
2026-VK-EDU-Web-12-Istratov-D/questions/models.py
T
redtea 4bc5fcef7a hw6, hw7
- Redis / Celery / Celery Beat
- кэширование популярных тегов и лучших участников
- асинхронные уведомления в Centrifugo
- отправка email-уведомлений через Celery
- полнотекстовый поиск и подсказки
- Docker Compose инфраструктура
2026-05-28 09:48:16 +03:00

168 lines
3.1 KiB
Python

from django.db import models
from django.contrib.auth.models import User
from django.contrib.postgres.indexes import GinIndex
from django.contrib.postgres.search import SearchVector
import uuid
import os
from .utils import crop_square
def avatar_upload_path(instance, filename):
ext = filename.split('.')[-1]
filename = f"{uuid.uuid4()}.{ext}"
return os.path.join('avatars', filename)
class Profile(models.Model):
user = models.OneToOneField(
User,
on_delete=models.CASCADE
)
avatar = models.ImageField(
upload_to=avatar_upload_path,
null=True,
blank=True
)
email = models.EmailField(unique=True)
nickname = models.CharField(max_length=100)
def __str__(self):
return self.user.username
def save(self, *args, **kwargs):
super().save(*args, **kwargs)
if self.avatar:
crop_square(self.avatar.path)
class Tag(models.Model):
name = models.CharField(
max_length=50,
unique=True
)
def __str__(self):
return self.name
class Question(models.Model):
title = models.CharField(max_length=50)
user = models.ForeignKey(
User,
on_delete=models.CASCADE
)
body = models.TextField()
rating = models.IntegerField(default=0)
tags = models.ManyToManyField(Tag)
created_at = models.DateTimeField(
auto_now_add=True
)
correct_answer = models.ForeignKey(
'Answer',
on_delete=models.SET_NULL,
null=True,
blank=True,
related_name='correct_for'
)
def __str__(self):
return self.title
class Meta:
indexes = [
GinIndex(SearchVector('title', 'body'), name='question_search_idx')
]
class QuestionReaction(models.Model):
question = models.ForeignKey(
Question,
on_delete=models.CASCADE,
related_name='reactions'
)
user = models.ForeignKey(
User,
on_delete=models.CASCADE
)
positive = models.BooleanField(default=True)
class Meta:
unique_together = ('question', 'user')
def __str__(self):
return (
"Reaction for "
+ self.question.title
+ " by "
+ self.user.username
)
class Answer(models.Model):
question = models.ForeignKey(
Question,
on_delete=models.CASCADE,
related_name='answers'
)
user = models.ForeignKey(
User,
on_delete=models.CASCADE
)
body = models.TextField()
rating = models.IntegerField(default=0)
created_at = models.DateTimeField(auto_now_add=True)
def __str__(self):
return (
"Answer for "
+ self.question.title
+ " by "
+ self.user.username
)
class AnswerReaction(models.Model):
answer = models.ForeignKey(
Answer,
on_delete=models.CASCADE,
related_name='reactions'
)
user = models.ForeignKey(
User,
on_delete=models.CASCADE
)
positive = models.BooleanField(default=True)
class Meta:
unique_together = ('answer', 'user')