Django - связь между тегами сервера, сервером и постом

Я создаю приложение клон reddit, Есть 3 сервера, каждый сервер имеет свой собственный набор тегов (например, для сервера еды: бургер, пицца,...) и каждый сервер может иметь несколько постов (прямо как Reddit).

Итак, как сделать так, чтобы пользователь мог выбирать между тегами при создании нового сообщения? пользователь должен иметь возможность выбрать только один из тегов, предназначенных для сервера, на котором будет размещен пост.

Я сделал ServerTag модель для сохранения тегов при создании нового сервера :

class ServerTag(models.Model):
    server = models.ForeignKey(Server, on_delete=models.CASCADE, related_name='tags')
    name = models.CharField(max_length=20)
    primary_color = ColorField(default = '#ffff')
    secondary_color = ColorField(default = '#ffff')
    is_allowed = models.BooleanField(default=True)

    def __str__(self) -> str:
        return f'{self.name} --> r/{self.server}'

Server модель:

class Server(models.Model):
    creator = models.ForeignKey(User , on_delete=models.CASCADE)
    created = models.DateTimeField(auto_now=True)
    name = models.CharField(max_length=50)
    about = models.TextField(default='about')
    tag = models.CharField(max_length=50)
    slug = models.SlugField(default='server')
    image = models.ImageField(upload_to='servers/pic/')
    header_image = models.ImageField(upload_to='servers/header-pic/')
    members_count = models.IntegerField(default=0)
    online_count = models.IntegerField(default=0)
    required_karma = models.IntegerField(default=0)

    def __str__(self):
        return self.name

и Post Модель:

class Post(models.Model):
    post_type_choices = [('text', 'text'), ('video', 'video'), ('image', 'image'), ('link','link')]
    title = models.CharField(max_length=200)
    slug = models.SlugField(max_length=50, default='slug')
    text = models.TextField(null=True, blank=True)
    text_allowed = models.BooleanField(default=True)
    image = models.ImageField(upload_to='posts/images/', null=True, blank=True)
    image_allowed = models.BooleanField(default=True)
    video = models.FileField(upload_to='posts/videos/', null=True, blank=True)
    video_allowed = models.BooleanField(default=True)
    server = models.ForeignKey(Server, on_delete=models.CASCADE, related_name='posts')
    creator = models.ForeignKey(User , on_delete=models.CASCADE, related_name='posts', null=True)
    created = models.DateTimeField(auto_now=True)
    type = models.CharField(max_length=5, choices=post_type_choices, default='text')
    votes_count = models.IntegerField(default=0)
    tag = models.ForeignKey(ServerTag, on_delete=models.CASCADE , default=1) //connected to the ServerTags model

в настоящее время Post имеет поле тегов, которое показывает все теги, созданные на всех серверах, хотя я хочу показывать только теги, предназначенные для сервера, на котором пользователь публикует сообщение.

Вернуться на верх