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