Django преобразование необработанных sql-запросов в django orm

Я использую Django Rest Framework и у меня есть этот запрос в необработанном SQL, но я хочу сделать его в Django ORM вместо этого. Я пробовал использовать различные инструменты Django, но до сих пор это не дало мне ожидаемого результата.

select tt.id, tt.team_id, tt.team_role_id, tt.user_id  from task_teammember tt 
inner join task_projectteam tp on tp.team_id = tt.team_id 
where tp.project_id = 1

модели

class TeamMember(models.Model):
    user       = models.ForeignKey(User, on_delete=models.CASCADE)
    team       = models.ForeignKey(Team, on_delete=models.CASCADE)
    team_role  = models.ForeignKey(TeamRole,on_delete=models.CASCADE)
    state      = models.IntegerField(default=1)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(default=None, null=True)


class ProjectTeam(models.Model):
    project    = models.ForeignKey(Project, on_delete=models.CASCADE, blank=True, null=True)
    team       = models.ForeignKey(Team, on_delete=models.CASCADE, blank=True, null=True)
    state      = models.IntegerField(default=1)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(default=None, null=True)

Если у вас уже есть объект project, то это должно дать вам то, что, как я полагаю, вы хотите. Ваша модель TeamMember имеет доступ к Team, который ссылается на ProjectTeam и на Project - аксессор double-underscore перемещается по взаимосвязям.

TeamMember.objects.filter(team__projectteam__project=project)

По-моему, это выглядит так:

TeamMember.objects.filter(team__projectteam__project__id=1)

Django orm allow reverse foreginkey lookup

Я бы посоветовал расположить ManyToManyField над ProjectTeam, это упростит запросы:

from django.conf import settings


class TeamMember(models.Model):
    user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
    updated_at = models.DateTimeField(auto_now=True)
    # …

class Team(models.Model):
    projects = models.ManyToManyField(Project, through='ProjectTeam')
    # …


class ProjectTeam(models.Model):
    # …
    updated_at = models.DateTimeField(auto_now=True)

Тогда вы можете легко отфильтровать с помощью:

TeamMember.objects.filter(team__projects=project_id)

Note: It is normally better to make use of the settings.AUTH_USER_MODEL [Django-doc] to refer to the user model, than to use the User model [Django-doc] directly. For more information you can see the referencing the User model section of the documentation.


Note: Django's DateTimeField [Django-doc] has a auto_now=… parameter [Django-doc] to work with timestamps. This will automatically assign the current datetime when updating the object, and mark it as non-editable (editable=False), such that it does not appear in ModelForms by default.

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