首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >allow_null=True时的Django PrimaryKeyRelatedField查询集

allow_null=True时的Django PrimaryKeyRelatedField查询集
EN

Stack Overflow用户
提问于 2017-05-22 19:27:33
回答 1查看 2.2K关注 0票数 1

我对Python和Django都是新手,而且我在可空的外键关系方面遇到了问题。我发现了与此类似的问题,但似乎没有一个问题涵盖了我的用例。

我使用的是Django 1.8.17和DRF 3.1.0

我在Django中有以下类(我已经将它们简化为相关的字段,因为我不能在这里轻松地复制/粘贴代码):

代码语言:javascript
复制
class Rationale(models.Model):
    id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=255)

class Alert(models.Model):
    id = models.AutoField(primary_key=True)
    rationale = models.ForeignKey(Rationale, null=True, blank=True)
    priority = models.IntegerField(default=1)

class AlertHistory(models.Model):
    id = models.AutoField(primary_key=True)
    alert =  = models.ForeignKey(Alert)
    rationale = models.ForeignKey(Rationale, null=True, blank=True)
    priority = models.IntegerField(null=True)

class AlertHistoryListView(generics.ListCreateAPIView):
    queryset = AlertHistory.objects.all()
    serializer_class = AlertHistorySerializer
    pagination_class = DefaultPagination

    filter_backends = (filters.DjangoFilterBackend, filters.OrderingFilter)
    filter_class = AlertHistoryFilterSet
    filter_fields = ['alert']
    ordering_fields = filter_fields        

class AlertHistoryFilterSet(django_filters.FilterSet):
    class Meta:
        model = AlertHistory
        fields = ['alert']

这里的想法是在历史表中捕获警报的更改。用户可以更新优先级或原理。

表的基本原理是预先填充了JSON fixture的查找。用户可以选择理由来给出警报打开的原因。不过,原理是可选的,因此可以为空。

然而,当我试图将基本原理设置为None时,我得到了一个错误:

{‘基本原理’:你的类型不正确。期望的pk值,收到的unicode。‘}

所以搜索一下,我找到了: the PrimaryKeyRelatedField:http://www.django-rest-framework.org/api-guide/relations/#primarykeyrelatedfield

然后我更新了我的AlertHistory序列化程序:

代码语言:javascript
复制
class AlertHistorySerializer(serializers.ModelSerializer):
    rationale = serializers.PrimaryKeyRelatedField(read_only=True, allow_null=True)

    class Meta:
        model = AlertHistory

这修复了我的第一个问题,但导致了测试中的问题,我正在更新原理。通过将其标记为read_only,我不能更新该字段,这并不奇怪。

文档说我需要指定read_only=True或查询集。然而,它没有提供如何做到这一点的示例,我找不到它,也找不到任何示例。

我需要涵盖以下两种情况:

data = {'alert‘:1,'priority’:2,rationale: 1 }来设置rationale 1的外键的理论基础。

和:

data = {'alert‘:1,'priority’:2,rationale: None }如果用户想要将rationale设置为null。当他们简单地更新优先级而不选择理由时,这种用例更有可能出现。

所以我试着把我的查询集定义为"all“

代码语言:javascript
复制
rationale = serializers.PrimaryKeyRelatedField(queryset=Rationale.objects.all(), allow_null=True)

但这会导致我所有的测试都会给出原始的异常:

{‘基本原理’:你的类型不正确。预期的pk值,收到unicode.'},即使我现在将allow_null设置为True。

然后我尝试定义:

代码语言:javascript
复制
rationale = serializers.PrimaryKeyRelatedField(queryset=Rationale.objects.get(pk=rationale), allow_null=True)

但它不知道什么是基本原理。

我也试过了:

代码语言:javascript
复制
rationale = serializers.PrimaryKeyRelatedField(source='rationale', allow_null=True) 

但这导致了我的错误:

queryset:关系字段必须提供“”queryset“”参数,或设置read_only=True。“”

如何正确定义我的查询集?

谢谢。

EN

回答 1

Stack Overflow用户

发布于 2017-05-22 20:30:45

使用此序列化程序:

代码语言:javascript
复制
class AlertHistorySerializer(serializers.ModelSerializer):

    class Meta:
        model = AlertHistory

型号:

代码语言:javascript
复制
class AlertHistory(models.Model):
    id = models.AutoField(primary_key=True)
    alert =  = models.ForeignKey(Alert)
    rationale = models.ForeignKey(Rationale, null=True)
    priority = models.IntegerField(null=True)

创建告警历史对象的json示例:

代码语言:javascript
复制
{
    "alert": 1,
    "rationale": null,
    "priority": 2
}

如果您想将rationale设置为null,请在json中发送null

PS:确保您的DB模式已更新,并且所有迁移都已应用。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44111702

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档