创建不带外键查找的Django模型对象实例

时间:2019-01-23 13:54:14

标签: django django-models

我有一个用例,我希望能够创建对其他模型具有外键约束的模型对象实例。

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}"

例如,我有FooBar类的实例。

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返回错误。有办法吗?

0 个答案:

没有答案