我有一个用例,我希望能够创建对其他模型具有外键约束的模型对象实例。
models.py
from django.db import models
class Foo(models.Model):
__module__ = "some_app"
foo_name = models.CharField(null=False, blank=False,
unique=True, max_length=50)
def __str__(self):
return self.foo_name
class Bar(models.Model):
__module__ = "some_app"
bar_name = models.CharField(null=False, blank=False,
unique=True, max_length=50)
def __str__(self):
return self.bar_name
class FooBar(models.Model):
__module__ = "some_app"
version = models.IntegerField(null=False, blank=False)
foo = models.ForeignKey(Foo, on_delete=models.CASCADE)
bar = models.ForeignKey(Bar, on_delete=models.CASCADE)
def __str__(self):
return f"{self.foo}@{self.bar}: {self.version}"
例如,我有Foo
和Bar
类的实例。
a_foo = Foo(foo_name="my_foo")
a_foo.save()
a_bar = Bar(bar_name="my_bar")
a_bar.save()
创建它们后的一段时间,我知道名称是什么,但是我没有对这些对象的引用。同样,我也不知道他们的ID。但是我确实想使用它们来创建FooBar
的实例。我可以通过执行此操作来创建该实例
foo = get_object_or_404(Foo, foo_name="my_foo")
bar = get_object_or_404(Bar, bar_name="my_bar")
foo_bar = FooBar(foo=foo, bar=bar, version=1)
但是要避免必须进行两个不必要的DB调用来创建对象的实例。甚至只是查找其ID。我想做的是这样的事情
foo_bar = FooBar(foo__foo_name="my_foo", bar__bar_name="my_bar", version=1)
然后,如果对应的对象不存在(或不是唯一的),则DB返回错误。有办法吗?