使用Django及其REST_Framework,我试图向POSTGRES-11数据库添加一个对象,其模型(Team)通过ForeignKey关系与另一个模型(国家)相关。我在post请求中发送的JSON如下所示,其中为country提供的数字应该是它的id。
name:"test"
is_onsite:true
status:"PAID"
institution:"testU"
country:2但是Django返回以下错误:
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,而不是添加对象:
{
"country": [
"This field is required."
]
}models.py:
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.nameserializers.py:
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:
class TeamCreateView(CreateAPIView):
queryset = Team.objects.all()
serializer_class = TeamSerializer我应该注意到,Django在尝试通过‘/api/寄存器/team’提供的HTML表单添加它时工作得非常好,但当它通过外部post请求接收JSON时就不行了。
我被困在这里好几天了,所以你的帮助会很感激的。
@dirkgroten -我忘了提到,我做了前一件事,在我的TeamSerializer中添加了下面的代码片段,并尝试在我的帖子请求中发送'countryId‘(而不是'country_id'),但它仍然不起作用。这个片段:
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:
name:"test"
is_onsite:true
status:"PAID"
institution:"testU"
country:{"name": "Test"}即使国家‘测试’存在于我的数据库中,但它仍然无法添加团队。
发布于 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对象:
{“名字”:“测试”,.“国家”:{“名称”:“安哥拉”}https://stackoverflow.com/questions/57726250
复制相似问题