【问题标题】:POST 400 Bad Request even though there is data there (Django Rest Framework)POST 400 Bad Request 即使那里有数据(Django Rest Framework)
【发布时间】:2021-03-23 22:06:09
【问题描述】:

我正在尝试使用 Django Rest Framework 通过 AJAX 请求发布数据,但我不断收到此错误:

POST /api/uservenue/ HTTP/1.1" 400 37
{"venue":["This field is required."]}

I am posting data for that field,但是,无法弄清楚我做错了什么。

AJAX 调用:

const addVenueToList = function(listId, venueName) {
  console.log(venueName);
  console.log(listId);

  $.ajax({
    type: "POST",
    url: '/api/uservenue/',
    dataType: 'json',
    data: {
      csrfmiddlewaretoken: document.querySelector('input[name="csrfmiddlewaretoken"]').value,
      'venue': JSON.stringify(venueName),
      'list': parseInt(listId)
    },
    success: function(data) {
      console.log('User added: ' + data)
    },
  });
}

这是我的序列化器:

class UserVenueSerializer(serializers.ModelSerializer):
    venue = mapCafesSerializer()
    
    class Meta:
        model = UserVenue
        fields = ['id', 'list', 'venue']

以下是相关模型:

class UserVenue(models.Model):
    venue = models.ForeignKey(mapCafes, on_delete=models.PROTECT)
    list = models.ForeignKey(UserList, on_delete=models.PROTECT)

    class Meta:
        unique_together = ['list','venue']

[...]

class mapCafes(models.Model): 
    id = models.BigAutoField(primary_key=True)
    cafe_name = models.CharField(max_length=200)
    cafe_address = models.CharField(max_length=200)
    cafe_long = models.FloatField()
    cafe_lat = models.FloatField()
    geolocation = models.PointField(geography=True, blank=True, null=True)
    venue_type = models.CharField(max_length=200)
    source = models.CharField(max_length=200)
    description = models.CharField(max_length=1000)

    class Meta:
        managed = False
        db_table = 'a_cafes'

【问题讨论】:

  • 只是想了解这里的流程,所以作为用户我想将一个场地发送到后端?还是场地是场地的数组(列表)?
  • 只是场地。因此,用户单击他们想要添加到列表中的场所,然后将其添加到列表中,以后可以与地址等一起引用。(场所已经存在于数据库中,用户只是将其存储在一个他们的名单)我觉得问题可能出在UserVenue 模型上。
  • 我认为确实如此。让我为你解答
  • @VJMagar 那太好了,谢谢!

标签: ajax django-models django-rest-framework


【解决方案1】:

试试

class UserVenueSerializer(serializers.ModelSerializer):
    venue = serializers.CharField(write_only=True)
    
    class Meta:
        model = UserVenue
        fields = ['id', 'list', 'venue']

    def create(self, validated_data):
       """Overrides the create method to create the UserVenue instance"""

        validated_data["venue"] = mapCafes.objects.get(cafe_name=validated_data.get("venue")
        return UserVenue.objects.create(**validated_data)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-12-22
    • 2019-10-27
    • 2020-06-26
    • 1970-01-01
    • 2015-06-02
    • 2017-09-26
    相关资源
    最近更新 更多