DRF在POST请求中使用字段值而不是默认值(pk)

时间:2019-08-12 20:36:18

标签: python-3.x api post serialization django-rest-framework

尝试发送有效的POST请求。

当我这样发送时,它是有效的:

<div class="tabContainer">
  <div class="buttonContainer">
    <button onclick="showPanel(this,'red', 0)" style="">Calculate HFOV</button>
    <button onclick="showPanel(this,'green', 1)" style="">Calculate Focal Length</button>
    <button onclick="showPanel(this,'yellow', 2)">Settings</button>
  </div>

  <div class="tabPanel" style="display: none; background-color: red;">
    <div class="calculateHFOV">
      <div class="dataContainer">
        <div class="input">input</div>
        <div class="fov">fov</div>
        <div class="natoTarget">natoTarget</div>
        <div class="humanTarget">humanTarget</div>
        <div class="objectTarget">objectTarget</div>
      </div>
    </div>

  </div>
  <div class="tabPanel" style="display: none; background-color: green;">
    <div class="calculateFocalLength">
      <div class="dataContainer">
        <div class="input">input</div>
        <div class="fov">fov</div>
        <div class="natoTarget">natoTarget</div>
        <div class="humanTarget">humanTarget</div>
        <div class="objectTarget">objectTarget</div>
      </div>
    </div>
  </div>
  <div class="tabPanel" style="display: block; background-color: yellow;">
    <div class="settings">
      <div class="dataContainer">
        <div class="parameters">parameters</div>
        <div class="linePairs">linePairs</div>
        <div class="targetSize">targetSize</div>
      </div>
    </div>
  </div>
</div>

响应就是这样,都有效:

{
  "name":"but",
  "sklad":1
}

但是当我尝试发送此邮件时,请加上“ fence”:

{
  "name": "but",
  "getsklad": "fence"
}

错误:

{
  "name":"but",
  "sklad":"fence"
}

在models.py中有这段代码:

Invalid type. The primary key value was expected, str was received.

在serializers.py中:

class Sklad(models.Model):
    storages = (
        ('fence', 'Забор'),
        ('sett', 'Тротуарка'),
    )
    storage = models.CharField(
        max_length=10,
        choices=storages, 
        help_text='Name of storage',
        default='sett'
    )

class Zabor(models.Model):
    sklad = models.ForeignKey(Sklad, on_delete=models.CASCADE)
    name = models.CharField(max_length=10)
    ...

和Views.py部分:

class ZaborPostSerializer(serializers.ModelSerializer):
    class Meta:
        model = Zabor
        fields = ( 
              ...
            'name',
            'sklad',
        )

我知道在请求中写“ 1”时的意思是“ pk”。但是我该如何发送姓名而不是id / pk?

我是初学者。所以不要因为愚蠢的问题而把我踢开)

1 个答案:

答案 0 :(得分:0)

由于您提供的是$charmap = array( "a" => "1", "b" => "2", "c" => "3" ); $string = "abc"; $string = str_replace(array_keys($charmap), $charmap, $string); FOREIGN_KEY ,因此您只能使用一种类型(整数,字符串等)按该值进行过滤。

您可以将Sklad的{​​{1}}字段设置为主键:

storage

现在您可以直接使用您的字符串值进行过滤。

另一种选择是在视图中进行过滤:

Sklad

请注意,只有在给定class Sklad(models.Model): storages = ( ('fence', 'Забор'), ('sett', 'Тротуарка'), ) storage = models.CharField( max_length=10, choices=storages, help_text='Name of storage', default='sett', primary_key=True ) 字段中只有一个from django.shortcuts import get_object_or_404 from django.http import Http404 class ZaborView(APIView): def post(self, request): dataDict = dict(request.data) try: sklad = get_object_or_404(Sklad.objects, storage=dataDict['sklad'][0]) serializer = ZaborPostSerializer(data=request.data) if serializer.is_valid(): serializer.save() return Response({'status': 'Success'}) else: return Response({'status': 'Failed'}) except Http404: return Response({'status': 'Failed'}) 的情况下,此方法才有效。 如果您有多个,则可以选择第一个,因为您没有提供主键,并且没有其他要过滤的字段:

Sklad

希望有帮助!