Python django rest框架在create中动态设置外键
我有一个模型:Python django rest框架在create中动态设置外键,python,django,django-rest-framework,Python,Django,Django Rest Framework,我有一个模型: class Foo(models.Model) field1 = CharField(max_length=24) capacity = models.IntegerField(default=10) def used(self): return self.bar_set.count() def is_available(self): return self.capacity - self.used() @staticmethod
class Foo(models.Model)
field1 = CharField(max_length=24)
capacity = models.IntegerField(default=10)
def used(self):
return self.bar_set.count()
def is_available(self):
return self.capacity - self.used()
@staticmethod
def get_or_create_foo(req_count=0):
foos = list(Foo.objects.all())
for foo in foos:
if foo.available() >= req_count:
return foo
else:
foo = Foo()
foo.save()
return foo
class Bar(models.Model)
field1 = models.CharField(max_length=24)
field1 = models.CharField(max_length=24)
foo = models.ForeignKey(Foo)
现在我有了如下序列化程序:
class FooSerializer(models.ModelSerializer)
class Meta:
model = models.Foo
class BarSerializer(models.ModelSerializer)
count = models.IntegerField()
field1 = models.CharField(max_length=24)
foo = models.ForeignKey(Foo)
class Meta:
model = models.Bar
def create(self, validated_data):
instance = super(BarSerializer, self).create(validated_data)
instance.foo = Foo.get_or_create_foo(validated_data['count'])
instance.save()
return instance
问题是instance=super(Bar,self)。在此行中创建(已验证的\u数据)
,异常:
Traceback (most recent call last):
File "/home/webmaster/prj/venv/lib/python3.4/site-packages/django/db/backends/utils.py", line 64, in execute
return self.cursor.execute(sql, params)
File "/home/webmaster/prj/venv/lib/python3.4/site-packages/django/db/backends/sqlite3/base.py", line 318, in execute
return Database.Cursor.execute(self, query, params)
sqlite3.IntegrityError: NOT NULL constraint failed: app_bar_foo_id
传递给BarSerializer的数据如下所示(注意,此处不发送foo,因为它需要动态填充):
我想,因为调用super会创建一个实例并保存它,而不使用FK,因为它没有在请求中传递并且失败,所以当使用
BarSerializer
实例化它时,在Bar中填充字段foo
的方法是什么调用create()
,我会这样做
def create(self, validated_data):
instance = BarSerializer(**validated_data)
instance.foo = Foo.get_or_create_foo(validated_data['count'])
instance.save()
return instance
def create(self, validated_data):
instance = BarSerializer(**validated_data)
instance.foo = Foo.get_or_create_foo(validated_data['count'])
instance.save()
return instance