Django - 基于查询更新或插入

时间:2015-10-19 09:18:08

标签: python django

学习如何使用Django。我正在尝试这段代码:

if form.is_valid() and form.has_changed():
    try:
        p = profile.objects.get(user_id= user.id)
        #Append data to profile record
                    profile_record.save()
    except p.DoesNotExist as e:
        #Create new profile record
        profile_record.save()

如果找不到user_id(FK字段),则会收到错误消息:

  

在赋值之前引用的局部变量'p'

我认为p = ...是作业?

感谢您提出我在这里做错的任何指示。

4 个答案:

答案 0 :(得分:3)

您的错误正在发生,因为在try部分中首先设置了p。在on上,你引用p,但是p还没有被指定给那个点上的任何东西,因为如果达到了except,那么try部分是“撤消”,那就是指定p的位置。

尝试将except p.DoesNotExist as e:更改为except Person.DoesNotExist:

答案 1 :(得分:1)

也许您可以使用get_or_create https://docs.djangoproject.com/en/1.8/ref/models/querysets/#django.db.models.query.QuerySet.get_or_create

p, created = profile.objects.get_or_create(user_id=user.id)

答案 2 :(得分:0)

尝试过滤查询.. .get 应始终使用,以防您在查询时知道只有一个对象。

if form.is_valid() and form.has_changed():
        p = profile.objects.filter(user_id = user.id)
        if p:
            p = p[0]
            #Append data to profile record
            profile_record.save()
        else:
            #Create new profile record
            profile_record.save()
如果没有结果或超过1个结果,

.get(field = something)将始终抛出错误,而.filter()在这些情况下不会抛出错误。

答案 3 :(得分:0)

为什么不使用

if form.is_valid() and form.has_changed():
    form.save()