Python Django:检查存在哪个相关对象
我有两种不同的模型引用djangoPython Django:检查存在哪个相关对象,python,django,Python,Django,我有两种不同的模型引用django用户,即招聘人员和用户档案 我有一个函数,它接收一个用户对象作为参数。我需要检查存在哪些相关对象,并采取相应的措施。我正在使用嵌套的try-catch执行此操作: def some_function(user, ....): ... try: profile = user.userprofile profile.profile_pic.save('{0}_social.jpg'.format(user.userna
用户
,即招聘人员
和用户档案
我有一个函数,它接收一个用户
对象作为参数。我需要检查存在哪些相关对象,并采取相应的措施。我正在使用嵌套的try-catch执行此操作:
def some_function(user, ....):
...
try:
profile = user.userprofile
profile.profile_pic.save('{0}_social.jpg'.format(user.username))
profile.save()
except:
try:
recruiter = user.recruiter
recruiter.cover_pic.save('{0}_social.jpg'.format(user.username))
recruiter.save()
except:
pass
有没有更好/更优雅的方法
编辑:考虑的模型如下
class Recruiter(models.Model):
user = models.OneToOneField(User, unique=True, related_name='recruiter')
...
class UserProfile(models.Model):
user = models.OneToOneField(User, unique=True, related_name='userprofile')
...
您可以像这样使用.exists()QuerySet API(假定user
是用户模型的一个实例,并且该模型的Userprofile和Recruiter键都有一个名为user
的字段):
请注意,.exists()
调用将首先执行查询以查看对象是否存在,然后访问该对象的行(例如,user.userprofile
)将运行另一个查询以实际访问该对象。一种稍微优化的方法,虽然可读性可能较低,但可能是:
def some_function(user, ...):
userprofiles = Userprofile.objects.filter(user=user)
recruiters = Recruiter.objects.filter(user=user)
if len(userprofiles):
profile = userprofiles[0]
profile.profile_pic.save('{0}_social.jpg'.format(user.username))
profile.save()
elif len(recruiters):
recruiter = recruiters[0]
recruiter.cover_pic.save('{0}_social.jpg'.format(user.username))
recruiter.save()
else:
# User has neither Userprofile nor Recruiter associated with it!
# Do something here to handle that case, or just get rid of the else
你能展示一下招聘人员和用户档案模型吗?@Joseph:我已经更新了这个问题
def some_function(user, ...):
userprofiles = Userprofile.objects.filter(user=user)
recruiters = Recruiter.objects.filter(user=user)
if len(userprofiles):
profile = userprofiles[0]
profile.profile_pic.save('{0}_social.jpg'.format(user.username))
profile.save()
elif len(recruiters):
recruiter = recruiters[0]
recruiter.cover_pic.save('{0}_social.jpg'.format(user.username))
recruiter.save()
else:
# User has neither Userprofile nor Recruiter associated with it!
# Do something here to handle that case, or just get rid of the else