我从我的数据库中提取两种对象,如下所示:
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 :(得分:1)
首先,您不需要首先建立单独的列表,也不必专门查询自由职业者。对于任何用户实例,user.freelancer
将通过一对一关系为您提供相关的Freelancer对象。
唯一的问题是,第一次对任何用户进行访问时,都会产生另一个数据库调用(尽管如此,将缓存来自同一用户实例的后续访问)。您可以通过在初始查询中执行select_related
来避免这种情况:
users = User.objects.filter(type=1).select_related('freelancer')