Python 基于foreignkey函数的过滤Django泛型关系

Python 基于foreignkey函数的过滤Django泛型关系,python,django,enums,django-queryset,Python,Django,Enums,Django Queryset,我想找到与我的角色相关的属性,这些属性适合不同的类别。最终,我想要这个输出: "Attributes": { "Physical": { "Level": 1, "Strength": 1, "Dexterity": 1, "Stamina": 1 }, "Mental": { "Level": 2, "I

我想找到与我的角色相关的属性,这些属性适合不同的类别。最终,我想要这个输出:

"Attributes": {
        "Physical": {
            "Level": 1,
            "Strength": 1,
            "Dexterity": 1,
            "Stamina": 1
        },
        "Mental": {
            "Level": 2,
            "Intelligence": 1,
            "Wits": 1,
            "Resolve": 1
        },
        "Social": {
            "Level": 3,
            "Presence": 1,
            "Manipulation": 1,
            "Composure": 1
        }
    },
我有一个类/Enum(),它的属性在中,还有一个查找方法:

class AttributeAbility(models.Model):

    class Attributes(AutoNumber):
        INTELLIGENCE = ()  # Mental, Power
        WITS = ()  # Mental', 'Finesse
        RESOLVE = ()  # Mental', 'Resistance
        STRENGTH = ()  # Physical', 'Power
        DEXTERITY = ()  # Physical', 'Finesse
        STAMINA = ()  # Physical', 'Resistance
        PRESENCE = ()  # Social', 'Power
        MANIPULATION = ()  # Social', 'Finesse
        COMPOSURE = ()  # Social', 'Resistance

    attribute = EnumField(Attributes)

    @property
    def attribute_type(self):
        attribute_group = lambda attribute: (
            int((attribute.value - 1) / 8)) + 1 % 3

        return Category(attribute_group(self.attribute))

class Category(AutoNumber):
    MENTAL = ()
    PHYSICAL = ()
    SOCIAL = ()
我使用以下类将属性与我的角色联系起来:

class CrossCharacterMixin(models.Model):
    cross_character_types = models.Q(app_label='mage', model='mage')
    content_type = models.ForeignKey(ContentType, limit_choices_to=cross_character_types,
                                     null=True, blank=True)
    object_id = models.PositiveIntegerField(null=True)
    content_object = GenericForeignKey('content_type', 'object_id')

    class Meta:
        abstract = True

class CharacterAttributeLink(Trait, CrossCharacterMixin):
    MIN = 1
    PRIORITY_CHOICES = (
        (0, 'Unassigned'), (1, 'Primary'), (2, 'Secondary'), (3, 'Tertiary')
    )
    attribute = models.ForeignKey('AttributeAbility')
    priority = models.PositiveSmallIntegerField(
        choices=PRIORITY_CHOICES, default=0
    )

    def __str__(self):
        return self.attribute.attribute.label
然后在法师身上我有:

attributes = GenericRelation('CharacterAttributeLink')

@property
def physical_attributes(self):
    type_id = Category['PHYSICAL']
    return self.attributes.filter(attribute_type=type_id)
但我得到的错误是:
无法将关键字“attribute\u type”解析到字段中。选项包括:属性、属性id、内容类型、内容类型id、当前值、id、最大值、对象id、优先级

我的功能是这样的:

@property
def physical_attributes(self):
    type_id = Category['PHYSICAL']
    return self.attributes.filter(attribute__attribute_type=type_id)
我得到了这个错误:
相关字段得到了无效的查找:attribute\u type
,这是有意义的(尽管我在文档中看到了这一点:
>>Entry.objects.filter(blog\u id=4)


在末尾添加
\uuuu-exact
,会给我这样的信息:
关系字段不支持嵌套查找
…此时我就丢失了。我需要一张支票吗?我是否需要将我的
物理属性
函数移到别处?

我最终创建了一个自定义管理器:

class CategoryManager(models.Manager):

    '''
    Class to manage instances that rely on the category enum
    '''

    def physical(self):
        return [categorised_item for categorised_item in super(CategoryManager, self).get_queryset().all()
                if categorised_item.category == Category['PHYSICAL']]

    def mental(self):
        return [categorised_item for categorised_item in super(CategoryManager, self).get_queryset().all()
                if categorised_item.category == Category['MENTAL']]

    def social(self):
        return [categorised_item for categorised_item in super(CategoryManager, self).get_queryset().all()
                if categorised_item.category == Category['SOCIAL']]
然后将其添加到我的属性模型中:

objects = CategoryManager()
并在我的角色模型上定义此属性:

@property
def social_skills(self):
    return [self.skills.filter(skill=skill) for skill
            in SkillAbility.objects.social()]