python - 使用 ChoiceField 时出现 Django Rest API TypeError

标签 python django django-rest-framework

尝试在序列化程序中使用 ChoiceField 时遇到 TypeError

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

这些是我的模型,以防需要解决问题。

# Campaign Model
class Campaign(models.Model):
    campaign_id = UUIDField(auto=True)
    name = models.CharField("Campaign Name", max_length=50)
    company = models.ForeignKey(Company)
    clist = models.ForeignKey(CList, verbose_name="Contact List", blank=True, null=True)
    user = models.ForeignKey(User, blank=True, null=True)

# CList Model
class CList(models.Model):
    name = models.CharField("Contact List", max_length=255)
    description = models.TextField(blank=True, null=True)
    contacts = models.ManyToManyField(Contact, related_name='con_clists')
    company = models.ForeignKey(Company)
    updated = models.DateTimeField(auto_now=True)
    created = models.DateTimeField(auto_now_add=True)
    uuid = models.CharField("ShortUUID", max_length=50, blank=True, null=True)

这是 View

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)

最佳答案

我认为您应该使用 PrimaryKeyRelatedField 而不是 ChoiceField,并在序列化器字段上定义自定义 get_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',
        )

关于python - 使用 ChoiceField 时出现 Django Rest API TypeError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45317114/

相关文章:

python - 属性错误 : '_NamespacePath' object has no attribute 'sort'

Python:仅使用形状文件的一部分

python - 按日期排序 Pandas ,自定义聚合器 : combine all the data for each date

Python正则表达式匹配已经匹配的子字符串

python - add_message() 参数必须是 HttpRequest 对象,而不是 'str'

Python + Django 页面重定向

python - Django - 减少 View 中重复的上下文代码

django - 在 django-rest 框架中使用原始 SQL?

Django SELECT COUNT(*) as "__count"对于每个查询

python - DRF : Serializer Group By Model Field