Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用ChoiceField时Django Rest API类型错误_Python_Django_Django Rest Framework - Fatal编程技术网

Python 使用ChoiceField时Django Rest API类型错误

Python 使用ChoiceField时Django Rest API类型错误,python,django,django-rest-framework,Python,Django,Django Rest Framework,尝试在序列化程序中使用选项字段时遇到类型错误 from rest_framework import serializers from rest_framework.fields import ChoiceField from comp_track_sys.models import Campaign from contacts.models import CList class EditCampaignSerializer(serializers.ModelSerializer):

尝试在序列化程序中使用
选项字段
时遇到
类型错误

from rest_framework import serializers
from rest_framework.fields import ChoiceField

from comp_track_sys.models import Campaign
from contacts.models import CList

class EditCampaignSerializer(serializers.ModelSerializer):
    class Meta:
        model = Campaign
        ...

    def __init__(self, *args, **kwargs):
        super(EditCampaignSerializer, self).__init__(*args, **kwargs)
        user = self.context['request'].user
        clists = CList.objects.filter(company=user.profile.company)
        self.fields['clist'] = ChoiceField(choices=clists)
我尝试过做
ChoiceField(choices=json.dumps(clists))
,但仍然出现了错误

TypeError: <CList: Testing> is not JSON serializable
这就是我们的观点

class EditCampaignViewSet(ModelViewSet):
    queryset = Campaign.objects.all()
    serializer_class = EditCampaignSerializer
    parser_classes = (MultiPartParser, FormParser)

    def list(self, request, type=None, *args, **kwargs):
        company = request.user.company
        queryset = Campaign.objects.filter(company=company,
                                           campaign_type=type)\
                                   .order_by('-created')\
                                   .prefetch_related('user__profile')
        serializer = EditCampaignSerializer(queryset, many=True, context={'request': self.request})
        return Response(serializer.data)

创建
选项字段时,需要确保
选项
关键字是可编辑的。通过使用
json.dumps(clists)
我想象您试图将
clists
转换为一个iterable,但是,
CList
类型无法json序列化,因为json库无法识别它

选择要设置为有效选项的字段后,可以尝试以下操作,例如,如果要选择的字段是主键:

ChoiceField(choices=list(clists.values_list('pk', flat=True)))
由于
.values\u list
方法返回一个iterable,因此可以将其传递给
choices=


希望我能帮上忙。

我认为您应该使用
PrimaryKeyRelatedField
而不是
ChoiceField
,并在序列化程序字段上定义一个自定义
get\u queryset
方法来过滤相关的
queryset

from rest_framework import serializers
from rest_framework.fields import ChoiceField

from comp_track_sys.models import Campaign
from contacts.models import CList

class CListPrimaryKeyRelatedField(serializers.PrimaryKeyRelatedField):

    def get_queryset(self):
        return self.queryset.filter(
           company=self.root.context['request'].user.profile.company
        )

class EditCampaignSerializer(serializers.ModelSerializer):

    clist = CListPrimaryKeyRelatedField(
        queryset=CList.objects.all(),
    )

    class Meta:
        model = Campaign
        fields = (
            'clist',
        )

您可能需要检查ChoiceField是否实际获取元组列表,即
[('no','no'),('yes','yes')]
是的,您是正确的,但是
ChoiceField
也可以只接受一个有效值的iterable,而不是映射:@mattjegan我尝试了您的建议,但似乎也不起作用。还是一样吗TypeError@chronoxJSON序列化程序类型错误还是其他类型?我不知道为什么这样做行不通,如果我们不再使用JSON.dumps,我也不认为会出现JSON错误。你能把你的观点也添加到这个问题上吗?@mattjegan yes仍然会出现不可JSON序列化的错误。我将更新我的问题以包括视图如果这只是为了将
CList
链接到
活动
为什么不使用
slugrelated字段
?或者您希望使用
ChoiceField
的具体原因是什么?使用ChoiceField的原因是因为我希望用户也能够创建新的活动
from rest_framework import serializers
from rest_framework.fields import ChoiceField

from comp_track_sys.models import Campaign
from contacts.models import CList

class CListPrimaryKeyRelatedField(serializers.PrimaryKeyRelatedField):

    def get_queryset(self):
        return self.queryset.filter(
           company=self.root.context['request'].user.profile.company
        )

class EditCampaignSerializer(serializers.ModelSerializer):

    clist = CListPrimaryKeyRelatedField(
        queryset=CList.objects.all(),
    )

    class Meta:
        model = Campaign
        fields = (
            'clist',
        )