Создание функциональности вклада в django (мне не обязательно нужен код, просто идея) - PullRequest
0 голосов
/ 21 января 2020

ПРИМЕЧАНИЕ Я не обязательно запрашиваю код для его создания, просто идеи о том, как это сделать. Ссылки и сообщения в блогах для указателей приветствуются.

Я создаю API отдыха.

У меня есть модель

class Showcase(models.Model):
    title = models.CharField(max_length=50)
    description = models.TextField(null=True)
    user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.DO_NOTHING, related_name="Showcases")
    created_on = models.DateTimeField(auto_now_add=True)
    updated_on = models.DateTimeField(auto_now=True)
    slug = models.SlugField(max_length=255, unique=True)

    def __str__(self):
        return self.title

Я пытаюсь создать функциональность, где Пользователь, который создал витрину, может добавлять пользователей, которые внесли свой вклад в проект, который является витриной. Я думал о том, чтобы создать свою собственную модель, подобную этой:

class Collaborator(models.Model):
    post = models.ForeignKey(Showcase, on_delete=models.CASCADE, related_name="collaborated_showcases")
    owner = models.ForeignKey(settings.AUTH_USER_MODEL, 
                            on_delete=models.CASCADE, related_name="showcase_owner")
    user = models.ForeignKey(settings.AUTH_USER_MODEL, 
                            on_delete=models.CASCADE, related_name="collaborators")
    skill = models.ForeignKey(Skill, on_delete=models.CASCADE, null=True, related_name="creative_type")
    role = models.TextField(null=True)
    added_on = models.DateTimeField(null=True)

    def __str__(self):
        return f"{self.user.name} collaborated on {self.post.name}"

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

Другая важная вещь заключается в том, что я хочу иметь возможность произвольно go для пользователя и получить ВСЕ витрины, в которые он внес вклад.

1 Ответ

1 голос
/ 21 января 2020

Как я понимаю, эта структура отлично работает для вашего варианта использования, хотя:

  • модели всегда должны быть в единственном числе (Collaborator)
  • related_name s должен быть в нижнем регистре (related_name="showcases")
  • , и я предпочитаю явно указать все связанные имена, поэтому я бы добавил
    • Collaborator.post связанное имя collaborated_showcases
    • Collaborator.user связанное имя collaborators
    • Showcase.user related_name owned_showcases

Затем

  • Чтобы найти собственные витрины, Showcase.objects.filter(user=user)
  • Чтобы найти совместные витрины пользователя, Showcase.objects.filter(collaborators=user) (я думаю)

Я бы предложил иметь объект Collaborator для пользователя-владельца кроме того, вы сможете легче показать их роль, а также упростить эти запросы.

...