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 theUser
model [Django-doc] directly. For more information you can see the referencing theUser
model section of the documentation.
Note: Django's
DateTimeField
[Django-doc] has aauto_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 inModelForm
s by default.