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

时间:2011-03-17 18:48:14

标签: python django django-models

我有一个模型,我想在其中保存一个新实例(行)。我有ForeignKey的主键,但我没有对象本身(假设它来自某个地方)。有没有办法在没有原始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是一个M2M中间表。我知道创建一个ManyToMany字段会更好,但它是遗留代码。

这是我的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 :(得分:4)

您可以使用ForeignKey对象下的id字段:

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

(我假设您最后一行中对Locale的引用实际上应该是UserLocale)。

答案 1 :(得分: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包含该字段的实际值。