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)

そのため、ここでは、いくつかのことを行っています。

ForeignKey 属性でa を使用していないためrelated_name、デフォルトで django はモデル名 (小文字) に続いて_set属性を割り当てます。.skilltag_set.all()

ValuesQuerySet を返します — モデル インスタンス オブジェクトではなく、イテラブルとして使用された場合にタプルを返す QuerySet サブクラスです。

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

基本的に、ValuesQuerySetタプルで構成される iterable of (リストまたはその他の iterable と考えてください) を取得しています。

  • flat=True

これは基本的に on-tuples を単一の値にフラット化します。

例:['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 に答える