Django服务请求

时间:2015-05-20 07:17:37

标签: django get nested-attributes

嘿伙计们,我在Django有点新鲜。我想要实现的是一个URL,我可以通过我的应用程序的GET请求访问该URL,并传递一些值。 我在Django中有一个UserProfile模型,它与User有一个OneToOneField关系。我想通过我的GET请求传递电子邮件并使用此电子邮件找到Userinstance,然后我想传递另外两个我想与此用户UserProfile属性进行比较的值。
但我不太满意了解如何实现这一目标。这就是我所拥有的:

在我的views.py

def check(request):
try:
    email = request.GET.get('email', '')
    osusername = request.GET.get('osusername', '')
    computername = request.GET.get('computername','')
except TypeError:
    return HttpResponseBadRequest()

user = get_object_or_404(User.objects.filter(user__email=email)[0])

在我的urls.py

urlpatterns = patterns('',
url(r'^check/$', 'myapp.views.check'),)

但是如何比较该用户的User.UserProfile.computername的实例计算机名?无论我怎么写错了。

我的UserProfile模型按要求@comments:

class UserProfile(models.Model):

user = models.OneToOneField(User, related_name='profile')
computername = models.CharField("Computername", max_length=150, blank=False)
osusername = models.CharField("Osusername", max_length=150, blank=False)

3 个答案:

答案 0 :(得分:1)

因此get_object_or_404的语法错误。你没有传递一个对象:它为你获取对象。所以:

user = get_object_or_404(User, email=email)

现在您已经拥有了一个用户实例,并希望获得相关的个人资料,所以您可以这样做:

 profile = user.userprofile

或者,如果您不需要其他任何实际用户实例,则可能更容易直接获取配置文件:

 profile = get_object_or_404(UserProfile, user__email=email)

现在您可以检查相关属性:

 osusername == profile.osusername
 computername == profile.computername

答案 1 :(得分:1)

您需要首先通过以下方式检索用户实例:

try:
    a_user = User.objects.get(email=email)
except User.DoesNotExist:
    # error handling if the user does not exist

然后,通过以下方式获取相应的UserProfile对象:

profile = a_user.userprofile

然后,您可以从UserProfile对象获取osusername和computername:

profile.osusername
profile.computername

答案 2 :(得分:0)

作为@daniel-roseman answer的补充。

如果检查相关属性是多个视图的常见任务,那么在UserProfile模型中创建一个可以执行所需验证检查的方法也是值得的。

class UserProfile(object):
    # various attributes ...

    def check_machine_attributes(self, os_username, computer_name):
        if os_username == self.osusername and computername == self.computername:
            return True
        return False

在您看来,您可以这样做:

if profile.check_machine_attributes(osusername, computername):
    # ...
else:
    # ...