首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Django REST Framework在已在POST参数中时请求相关模型的id

Django REST Framework在已在POST参数中时请求相关模型的id
EN

Stack Overflow用户
提问于 2019-08-30 11:53:19
回答 1查看 374关注 0票数 1

使用Django及其REST_Framework,我试图向POSTGRES-11数据库添加一个对象,其模型(Team)通过ForeignKey关系与另一个模型(国家)相关。我在post请求中发送的JSON如下所示,其中为country提供的数字应该是它的id。

代码语言:javascript
复制
name:"test"
is_onsite:true
status:"PAID"
institution:"testU"
country:2

但是Django返回以下错误:

代码语言:javascript
复制
IntegrityError at /api/register/team/
null value in column "country_id" violates not-null constraint
DETAIL:  Failing row contains (28, , f, PENDING, , null).

我尝试用“country”替换为“country_id”发送相同的json,但也遇到了同样的错误。

我已经尝试过给定Here的解决方案,但是Django返回这个JSON,而不是添加对象:

代码语言:javascript
复制
{
    "country": [
        "This field is required."
    ]
}

models.py:

代码语言:javascript
复制
class Country(models.Model):
    name = models.CharField(max_length=255)
    flag = models.ImageField()
    class Meta:
        verbose_name_plural = 'Countries'

    def __str__(self):
        return self.name

class Team(models.Model):
    name = models.CharField(max_length=255, default="", blank=True)
    is_onsite = models.BooleanField(default=False)
    status = models.CharField(max_length=50, choices=TEAM_STATUS_CHOICES, default='PENDING')
    institution = models.CharField(max_length=255, default="")
    country = models.ForeignKey(Country, on_delete=models.CASCADE, default="", blank=True)

    def __str__(self):
        return self.name

serializers.py:

代码语言:javascript
复制
class CountrySerializer(serializers.ModelSerializer):
    class Meta:
        model = Country 
        fields = '__all__'

class TeamSerializer(serializers.ModelSerializer):
    class Meta:
        model = Team 
        fields = ['name', 'is_onsite', 'status', 'institution', 'country']

views.py:

代码语言:javascript
复制
class TeamCreateView(CreateAPIView):
    queryset = Team.objects.all()
    serializer_class = TeamSerializer

我应该注意到,Django在尝试通过‘/api/寄存器/team’提供的HTML表单添加它时工作得非常好,但当它通过外部post请求接收JSON时就不行了。

我被困在这里好几天了,所以你的帮助会很感激的。

@dirkgroten -我忘了提到,我做了前一件事,在我的TeamSerializer中添加了下面的代码片段,并尝试在我的帖子请求中发送'countryId‘(而不是'country_id'),但它仍然不起作用。这个片段:

代码语言:javascript
复制
countryId = serializers.PrimaryKeyRelatedField(queryset=Country.objects.all())
    def create(self, validated_data):
        print(validated_data)
        return Team.objects.create(
            name=validated_data['name'],
            is_onsite=validated_data['is_onsite'],
            status=validated_data['status'],
            institution=validated_data['institution'],
            country=validated_data['countryId']
        )

至于后一种情况,我在代码中添加了country = CountrySerializer(many=False)行,并发送了一个JSON,如下所示,但我仍然得到了“这个字段是必需的”JSON。我的帖子JSON:

代码语言:javascript
复制
name:"test"
is_onsite:true
status:"PAID"
institution:"testU"
country:{"name": "Test"}

即使国家‘测试’存在于我的数据库中,但它仍然无法添加团队。

EN

回答 1

Stack Overflow用户

发布于 2019-08-30 12:45:24

首先,应该在default="", blank=True模型的country字段中删除Team。默认情况下,FK字段不应该有空字符串。如果您希望您的国家可能“未设置”,请使用blank=True, null=True。但是,如果每个Team总是必须有一个国家,那就什么都不要添加。

你可以做两件事:

  • 要么在'country_id'字段中使用TeamSerializer,然后在JSON中将字段作为country_id传递。您需要同时执行这两项操作,在JSON中传递country_id,但是country作为序列化程序中的字段不能工作。 字段= 'name','is_onsite','status','institution','country_id‘
  • 或者将country = CountrySerializer(many=False)添加到TeamSerializer中,但是在json中,您需要在请求中嵌套一个国家,它将创建country对象: {“名字”:“测试”,.“国家”:{“名称”:“安哥拉”}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57726250

复制
相关文章

相似问题

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