Django检查表中是否存在反向查找

时间:2014-08-11 17:04:46

标签: python django

我有2个与外键关系相关的django应用程序。模型如下:

app1:models.py

from django.db import models
from app2.models import Student

class Profile(models.Model):
    profile_id = models.IntegerField(primary_key=True)
    student_id = models.ForeignKey('app2.Student', null=True, blank=True)
    status = models.CharField(max_length=150, null=True, blank=True)

app2:models.py

from django.db import models
from app1.models import Profile

class Student(models.Model):
    student_id = models.IntegerField(primary_key=True)
    first_name = models.CharField(max_length=150, null=True, blank=True)
    last_name = models.CharField(max_length=150, null=True, blank=True)

我试图在shell中实现如下反向查找:

>>> student_detail = Student.objects.all()
>>> student_detail = student_detail.filter(first_name='Anabelle')
>>> student_detail
[<Student: Oldham, Anabelle>, <Student: Sartain, Anabelle>, <Student: Handley, Anabelle>]
>>> b=student_detail[0]
>>> obj=b.dyslexia_profiles_set.get(student_id=student_detail[0].student_id)
>>> obj
<Dyslexia_profiles: Dyslexia_profiles object>
>>> obj.status
u'0'

如果我发出如下命令,它就不会给我任何东西:

>>> b=student_detail[1]
>>> obj=b.dyslexia_profiles_set.get(student_id=student_detail[0].student_id)
Traceback (most recent call last):
  File "<console>", line 1, in <module>
  File "/home/abhishek/workspace/Django_apps/Edugence/local/lib/python2.7/site-packages/django/db/models/manager.py", line 151, in get
    return self.get_queryset().get(*args, **kwargs)
  File "/home/abhishek/workspace/Django_apps/Edugence/local/lib/python2.7/site-packages/django/db/models/query.py", line 310, in get
    self.model._meta.object_name)
DoesNotExist: Dyslexia_profiles matching query does not exist.

这是真的,因为该对象的记录不存在。如何检查配置文件表中是否存在反向查找?

我尝试过这样的事情,但收到了错误:

>>> if b.dyslexia_profiles_set.get(student_id=student_detail[0].student_id).exists():
...     print("exists")
... 
Traceback (most recent call last):
  File "<console>", line 1, in <module>
AttributeError: 'Dyslexia_profiles' object has no attribute 'exists'

1 个答案:

答案 0 :(得分:1)

使用filter代替get来测试是否存在。 filter返回一个支持exists调用的查询集。 get返回一个模型实例(如果存在),或者如果没有则引发异常。

或者只是抓住异常,也可以 - 如果您要检索对象(例如存在),则更为可取。

根据您正在尝试做的事情,可能会有一些有用的帮助/快捷功能。例如,get_object_or_404对于您希望基于URL参数的对象并且希望为与BD记录不匹配的参数返回404的常见情况很有用。如果您想在必要时记录新信息,并且确保您拥有内存中对象,则get_or_create非常有用。