gpt4 book ai didi

python - 在 Django Rest Framework 中的序列化程序之间混合公共(public)字段

转载 作者:太空狗 更新时间:2023-10-29 20:37:07 25 4
gpt4 key购买 nike

我有这个:

class GenericCharacterFieldMixin():
attributes = serializers.SerializerMethodField('character_attribute')
skills = serializers.SerializerMethodField('character_skill')

def character_attribute(self, obj):
character_attribute_fields = {}
character_attribute_fields['mental'] = {str(trait_item.get()): trait_item.get().current_value
for trait_item in obj.mental_attributes}
character_attribute_fields['physical'] = {str(trait_item.get()): trait_item.get().current_value
for trait_item in obj.physical_attributes}
character_attribute_fields['social'] = {str(trait_item.get()): trait_item.get().current_value
for trait_item in obj.social_attributes}
return character_attribute_fields

def character_skill(self, obj):
character_skill_fields = {}
character_skill_fields['mental'] = {str(trait_item.get()): trait_item.get().current_value
for trait_item in obj.mental_skills}
character_skill_fields['physical'] = {str(trait_item.get()): trait_item.get().current_value
for trait_item in obj.physical_skills}
character_skill_fields['social'] = {str(trait_item.get()): trait_item.get().current_value
for trait_item in obj.social_skills}
return character_skill_fields


class MageSerializer(GenericCharacterFieldMixin, serializers.ModelSerializer):
player = serializers.ReadOnlyField(source='player.username')
arcana = serializers.SerializerMethodField()

def get_arcana(self, obj):
if obj:
return {str(arcana): arcana.current_value for arcana in obj.linked_arcana.all()}

class Meta:
model = Mage
fields = ('id', 'player', 'name', 'sub_race', 'faction', 'is_published',
'power_level', 'energy_trait', 'virtue', 'vice', 'morality', 'size',
'arcana', 'attributes', 'skills')
depth = 1

GenericCharacterFieldMixin 是字符字段的混合,它们是通用的,即对所有类型的字符都是通用的。

我希望我的 Mage Serializer 将这些“混合”而不是 c/p 然后在所有类型的角色之间(Mage 是一种角色)希望这会增加我的 webapp 中的 DRYness。

问题出在我的模型上:

class NWODCharacter(models.Model):

class Meta:
abstract = True
ordering = ['updated_date', 'created_date']

name = models.CharField(max_length=200)
player = models.ForeignKey('auth.User', related_name="%(class)s_by_user")
....

def save(self, *args, **kwargs):
...

attributes = GenericRelation('CharacterAttributeLink')
skills = GenericRelation('CharacterSkillLink')

这意味着我得到了这个错误:

TypeError at /characters/api/mages
<django.contrib.contenttypes.fields.create_generic_related_manager.<locals>.GenericRelatedObjectManager object at 0x00000000051CBD30> is not JSON serializable

Django Rest Framework 认为我想序列化我的通用关系。

如果我重命名模型中的字段(s/attributes/foos/gs/skills/bars/g),那么我会得到一个不同的(不太清楚?)错误:

ImproperlyConfigured at /characters/api/mages
Field name `attributes` is not valid for model `ModelBase`.

如何在不混淆 DRF 的情况下将这些方法和字段放入混入中?

最佳答案

设置SerializerMetaclass:

from rest_framework import serializers

class GenericCharacterFieldMixin(metaclass=serializers.SerializerMetaclass):
# ...

这就是解决方案 recommended by DRF's authors .

前面回答中建议的解决方案是有问题的:

  1. user1376455 的解决方案通过在子项上将它们声明为不同的字段来破解 DRF 以在 _declared_fields 中注册 mixin 的字段。此 hack 可能不适用于框架的后续版本。
  2. Nikolay Fominyh 的解决方案将 mixin 更改为一个完全成熟的序列化程序(请注意,由于这个原因,名称 GenericCharacterFieldMixin 对于一个不是 mixin 而是序列化程序的类来说是非常不幸的!)。这是有问题的,因为它将完整的 Serializer 类带入多重继承,参见 DRF issue举例说明为什么这是个坏主意。

关于python - 在 Django Rest Framework 中的序列化程序之间混合公共(public)字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28747487/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com