如何在不获取外部对象实例的情况下保存ForeignKey?

2 投票
2 回答
2465 浏览
提问于 2025-04-16 13:55

我有一个模型,我想保存一个新的实例(行)。我有外键的主键,但没有这个对象本身(假设它是从某个地方来的)。有没有办法在不使用原始SQL的情况下,且不需要获取这个实例的情况下保存它呢?

这是我的模型:

class UserLocale(models.Model):

    user = models.ForeignKey(KingUser)
    locale = models.ForeignKey(Locale)

现在假设我有一个地区的主键('en_US'),但我没有这个对象本身。我现在的做法是:

def save_locale(user_instance, locale_name):
    locale = Locale.objects.get(pk=locale_name)
    UserLocale.objects.create(user=user_instance, locale=locale)

我知道我可以通过原始SQL一步完成,但我想知道是否可以在Django的查询模型中做到这一点。

编辑:

是的,UserLocale是一个多对多的中间表。我知道如果做成一个多对多字段会更好,但这是遗留代码。

这是我尝试的SQL(没有测试,我是手动写的,因为我离开了代码):

def save_raw_sql(user_instance, locale_name):

    query = """
            INSERT INTO 
                project_userlocale (user_id, locale_id)
            values (%s, %s)
            """

     UserLocale.objects.raw(query, [user_instance.id, locale_name])

2 个回答

0
def save_locale(user_instance, locale_name):
    user_locale = UserLocale()
    user_locale.user = user_instance
    user_locale.locale_id = locale_name
    user_locale.save()

如果你调用这个对象,你会看到一个叫 .locale 的属性,它指向一个 Locale 类,另外还有一个 .locale_id 属性,它里面存的是这个字段的真实值。

5

你可以直接使用ForeignKey对象下面的id字段:

UserLocale.objects.create(user=user_instance, locale_id=locale)

(我猜你最后一行提到的Locale其实应该是UserLocale。)

撰写回答