Как сохранить ForeignKey без извлечения экземпляра стороннего объекта? - PullRequest
1 голос
/ 17 марта 2011

У меня есть модель, в которой я хочу сохранить новый экземпляр (строку). У меня есть первичный ключ для 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 ]

4 голосов
/ 17 марта 2011

Вы можете просто использовать поле id, лежащее в основе объекта ForeignKey:

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

(я полагаю, что ссылка на Locale в вашей последней строке должна была фактически быть UserLocale).

0 голосов
/ 17 марта 2011
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, который содержит реальное значение для поля.

...