2015-11-23 1 views
0

Я выборка двух видов объектов из моей базы данных следующим образом:Извлечение объектов и объединение их в один списке

def browse_freelancers(request): 
    users = User.objects.filter(type=1) 

    freelancers = [] 

    for user in users: 
     freelancers.append(Freelancer.object.get(user=user)) 

Это дает мне QuerySet пользователей и список фрилансеров. Исходя из списков Java или C#, и их простота использования всегда меня путала (по какой-то причине). Есть ли способ элегантно объединить QuerySet и список в один список, где объект User связан со своим связанным с ним объектом Freelancer?

#models.py 

class Freelancer(models.Model): 
    def __unicode__(self): 
     return self.first_name 

    user = models.OneToOneField(User) 
    first_name = models.CharField(max_length=128) 
    surname = models.CharField(max_length=128) 
    university = models.CharField(max_length=256) 
    biography = models.TextField(default="") 
    skills = models.ManyToManyField(Skill, blank=True) 

    object = UserManager() 

class User(AbstractBaseUser): 

    STATUS_CHOICES = (
    (1, 'Freelancer'), 
    (2, 'Client'), 
) 

    email = models.EmailField(unique=True) 
    type = models.IntegerField(choices=STATUS_CHOICES) 
    verify_key = models.CharField(unique=True, max_length=16, null=True) 
    verified = models.BooleanField(default=False) 
    created_date = models.DateTimeField(default=timezone.now) 

    USERNAME_FIELD = 'email' 

    objects = UserManager() 
+0

Я уверен, что есть способ сделать это без итерация 'users', но мы должны видеть отношения в модели, чтобы писать. Не могли бы вы добавить вам 'models.py'? – pythad

+0

Добавлено как запрошено. – Nanor

ответ

1

Во-первых, вам не нужно создавать отдельный список в первую очередь, и вам не нужно специально запрашивать фрилансеров. Для любого экземпляра пользователя user.freelancer предоставит вам связанный объект Freelancer через отношения «один-к-одному».

Единственная проблема заключается в том, что при первом доступе к любому пользователю, который вы понесете другим вызовом базы данных (хотя последующий доступ из того же экземпляра пользователя будет кэширован, хотя). Вы можете избежать этого, выполнив select_related на первоначальный запрос:

users = User.objects.filter(type=1).select_related('freelancer') 
0

Вы можете получить все фрилансеры использовать что-то вроде:

freelancers = Freelancer.objects.filter(user__type=1) 

С фрилансер имеет один-к-одному с пользователем, freelancer.user даст вам соответствующий пользователь.

В качестве оптимизации, если вы знаете, что вы собираетесь получить доступ ко всем пользователям, вы могли бы сделать:

Freelancer.objects.filter(user__type=1).select_related('user') 

Эта выборка данных фрилансеров и пользователей из БД.

Смежные вопросы