0

正如您可以从标题中猜到的那样,我不确定如何描述我想要的。请查看以下课程:

from django.db import models
from django.contrib.auth.models import User as Auth_User


class User(Auth_User):

    Portfolio = models.ManyToManyField('PortfolioItem', through='SkillTag')
    Age = models.IntegerField(blank=False)

    @property
    def full_name(self):
        return self.first_name + ' ' + self.last_name

    def __unicode__(self):
        return self.full_name


class PortfolioItem(models.Model):

    Title = models.CharField(max_length=200, blank=False)


class SkillTag(models.Model):

    User = models.ForeignKey('User')
    PortfolioItem = models.ForeignKey('PortfolioItem')

    Tag_Name = models.CharField(max_length=200, blank=False)

我需要做的是,对于每个用户,获取Tag_Name它的所有值,SkillTags我该怎么做?

4

2 回答 2

4

你可以做这样的事情

class User(Auth_User):
    #other attributes
    def tag_names(self):
        return self.skilltag_set.values_list('Tag_Name', flat=True)

所以,在这里,我们正在做几件事:

由于您没有related_name在 ForeignKey 属性中使用 a,默认情况下 django 会分配模型名称(小写),后跟_set属性,这使得它.skilltag_set.all()

返回一个 ValuesQuerySet — 一个 QuerySet 子类,它在用作可迭代对象而不是模型实例对象时返回元组。

例子:[('a'), ('b'), ('c')]

基本上,您正在检索ValuesQuerySet由元组组成的可迭代对象(将其视为列表或任何其他可迭代对象)。

  • 平=真

这基本上将元组扁平化为单个值。

例子:['a', 'b', 'c']

于 2013-09-06T16:50:39.393 回答
3

最明显:使用ForeignKey 字段的反向关系:

def skill_names_1(user):
  return [t.name for t in user.skilltag_set.all()]

同样的事情,但明确地为用户选择。此外,它仅从数据库中获取必填字段。

def skill_names_2(user):
  return SkillTag.objects.filter(User=user).values_list('Tag_Name',flat=True)

这些中的任何一个也可以作为 User 的方法工作。当然,通常会调用参数self而不是user.

一组用户的所有技能:

def skill_names_3(users):
  return SkillTag.objects.filter(User__in=users).values_list('Tag_Name',flat=True)
于 2013-09-06T16:57:02.610 回答