LEFT OUTER JOIN com definições adicionais no Django

votos
1

Projeto de classe (models.Model): users = models.ManyToManyField (User, através de 'Project_User' =)

class Project_User(models.Model):
    project = models.ForeignKey('Project')
    user = models.ForeignKey(User)
    property = models.BooleanField()

Nem todos os projectos têm linhas próprias Project_User.

Coisa, o que eu preciso é obter queryset de todos os Projectos em campo propriedade do usuário atual! = True ou Project_User fileira de usuário atual não existe. Está aqui alguma maneira de fazer isso usando ORM do Django? Como resultado, eu preciso Queryset objeto para a aplicação de alguns outros filtros para ele.

Usando SQL personalizada que posso fazê-lo. usuário atual tem id == XXXX:

SELECT * FROM app_project LEFT OUTER JOIN app_project_user 
ON (app_project.id = app_project_user.project_id 
    AND (app_project_user.user_id = XXXX OR app_project_user.user_id IS NULL)) 
WHERE (app_project_user.property = false OR app_project_user.property IS NULL);

Espero, é possível, mas eu não sei como, mas ..

Obrigado por qualquer ajuda!

Publicado 21/05/2009 em 00:50
fonte usuário
Em outras línguas...                            


2 respostas

votos
3

Para pesquisas complexas (e qualquer pesquisa, essencialmente, envolvendo OR), eu recomendo operador Q do Django .

Neste caso, a consulta pode parecer:

from django.db.models import Q

q = (Q(project_user=my_current_user) | Q(project_user=None)) & \
    (Q(project_user__property=False) | Q(project_user__property=None))
projects = Project.objects.filter(q)

Neste caso, não se esqueça de indicar que NULLé permitido para o seu propertycampo:

class Project_User(models.Model):
    # ... as above, then:
    property= models.BooleanField(null=True)

Caso contrário, o Django irá emitir SQL CREATE TABLE para o propertycampo que indica especificamente nulo não é permitido ( "property" bool NOT NULL), o que estaria em contradição com o uso de Q(project_user__property=None).

Respondeu 21/05/2009 em 02:29
fonte usuário

votos
0

Algo ao longo das linhas de

p = Projects.objects.filter( users=current_user )
p = p.exclude( project_user__user=current_user,
               project_user__property=True )

Isso deve lhe dar um queryset de todos os projetos para o usuário atual, excluindo aqueles para os quais há uma Project_User para o usuário atual, que é o valor da propriedade é True

Mais informações: http://docs.djangoproject.com/en/dev/topics/db/queries/#lookups-that-span-relationships

Respondeu 21/05/2009 em 01:58
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more