Как получить доступ к объекту «многие ко многим», чтобы получить другое свойство модели? - PullRequest
1 голос
/ 27 июня 2019

Я кодирую всплывающую подсказку для панели инструментов Django, поэтому в одном из сценариев говорится, что, когда пользователь не подключил свою учетную запись Github, ссылка на репозиторий будет отключена.Я уже решил проблему, но не понял, что она работает только для владельца репо, поэтому, если я добавлю кого-то еще в качестве соавтора, ссылка будет работать для них, потому что они не являются владельцами.

models.py

class Project(models.Model):
    owner = models.ForeignKey(
        TeamMember,
        related_name="github_repos",
        blank=True,
        null=True,
        on_delete=models.SET_NULL,
    )

    members = models.ManyToManyField(
        TeamMember,
        related_name="new_projects",
        blank=True,
        through=ProjectMember,
    )

class TeamMember(models.Model):
    class Meta:
        unique_together = ("team", "user_id")

    django_user = models.OneToOneField(
        settings.AUTH_USER_MODEL,
        related_name="team_member",
        null=True,
        on_delete=models.SET_NULL,
    )
    team = models.ForeignKey(
        Team, related_name="members", on_delete=models.SET_NULL, null=True
    )
    github_username = models.CharField(max_length=100, blank=True)

Таким образом, в принципе, я решил проблему следующим образом:

    def html_message(self):
        pattern = re.compile("Github Repository", re.IGNORECASE)

        if self.project.owner.has_connected_github:
            git_connection = self.project.owner.django_user.socialaccount_set.filter(
                provider="github"
            ).first()
            if git_connection:
                html_message = pattern.sub(
                    f"<a href='{self.project.html_url}'>Github Repository</a>", self.message
                )
            else:
                html_message = pattern.sub(
                    f"<a href='#' data-toggle='tooltip' title='Connect your Github account to access repository.'>Github Repository</a>", self.message
                ) 

Это работает, но, как я уже говорил, только для владельцаприложения мне нужно знать, как получить доступ к members вместо owner, потому что, как вы можете видеть, это поле «многие ко многим».

Есть идеи, как мне получить к нему доступ?Я видел похожие вопросы, но не до конца их понимаю.

Ответы [ 2 ]

1 голос
/ 27 июня 2019

Поскольку members является полем m2m, вы можете получить доступ к TeamMember queryset через project.members.all(). Это в основном то же самое, что и TeamMember.objects.filter(project=self.project)

Чтобы отобразить правильное сообщение для определенного члена, вы должны иметь доступ к этому члену в вашем методе html_message. Возможно, у вас есть пользователь где-то в вашем запросе или присоединен к классу. Вот пример:

# Pass the user to the method. Maybe you have it in the request.user somewhere near
def html_message(self, user): # or pass a request and then get request.user
    pattern = re.compile("Github Repository", re.IGNORECASE)

    member = self.project.members.filter(django_user=user)

    # It's not clear what your needs if a member does not exist,
    # so I'm taking a shourtcut
    if not member:
        return

    if member.has_connected_github:
        git_connection = user.socialaccount_set.filter(provider="github").first()
        if git_connection:
            html_message = pattern.sub(
                f"<a href='{self.project.html_url}'>Github Repository</a>", self.message
            )
        else:
            html_message = pattern.sub(
                f"<a href='#' data-toggle='tooltip' title='Connect your Github account to access repository.'>Github Repository</a>", self.message
            ) 
0 голосов
/ 27 июня 2019

Я бы лично подошел к этому так

  1. Получить все members в проекте

    all_members = self.project.members.all()

возвращает QuerySet

Переберите all_members QuerySet и примените ту же логику, что и для owner

Примерно так:

for member in all_members:
    if member.has_connected_github:
      .................
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...