Bisect queryset em torno de queryset de outro modelo

votos
0

Eu estou escrevendo um aplicativo orientado pelo usuário com várias zonas para ele. Quero permitir que os usuários personalizem suas definições de mensagens para que eles só recebem e-mails sobre as peças e ações que eles se preocupam. Eu já elaborado o seguinte Class:

class EmailSetting(models.Model):
    user = models.ForeignKey(User, related_name=%(class)s_related_user)
    key = models.CharField(max_length=50)
    value = models.BooleanField()

Isso é para ser usado por um método chamado get_users(key, default), que deve retornar uma lista de usuários. Por exemplo, se eu pedir uma lista de usuários que estão subbed em uma key=new_post, default=False, eu deveria ter uma lista de usuários, onde eles têm um EmailSetting com um valor de True para essa chave. Isso é bastante simples, porque eu posso usar apenas o modelo EmailSetting.

Se o padrão é True, as coisas parecem ser mais difícil. Eu nunca fiz nada mais complicado do look-ups básicos com modelos, então eu preciso de uma mão.

A partir de uma lista completa de usuários, eu preciso remover aqueles com um EmailSetting False. Curto de fazer outra consulta sobre EmailSetting procurando entradas falsas e iterativa cortá-los fora do primeiro queryset, eu não posso ver como fazer isso ...

... Mas não deve haver outra maneira, porque isso fede.

Publicado 15/01/2009 em 12:49
fonte usuário
Em outras línguas...                            


2 respostas

votos
1

Bem, aqui está como eu fiz isso:

def get_users(key, default):
    if not default:
        return [es.user for es in EmailSetting.objects.filter(key = key, value = True)]
    return User.objects.exclude(pk__in = [es.user.pk for es in EmailSetting.objects.filter(key = key, value = False)])

Blisteringly simples quando você pensa sobre isso! Tem que amar o Python sintaxe algumas vezes =)

Respondeu 15/01/2009 em 13:39
fonte usuário

votos
0

I mudou seu nome relacionado no campo do usuário, como eu não acho que você quer para se referir a um EmailSetting com "usuário" no nome.

def get_users(key, default):
    if default:
        return User.objects.exclude(emailsetting__key=key, emailsetting__value=False)
    else:
        return User.objects.filter(emailsetting__key=key, emailsetting__value=True)
Respondeu 15/01/2009 em 13:52
fonte usuário

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