获取对象并将它们组合在一个列表中

时间:2015-11-23 11:29:00

标签: python django

我从我的数据库中提取两种对象,如下所示:

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()

1 个答案:

答案 0 :(得分:1)

首先,您不需要首先建立单独的列表,也不必专门查询自由职业者。对于任何用户实例,user.freelancer将通过一对一关系为您提供相关的Freelancer对象。

唯一的问题是,第一次对任何用户进行访问时,都会产生另一个数据库调用(尽管如此,将缓存来自同一用户实例的后续访问)。您可以通过在初始查询中执行select_related来避免这种情况:

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