【问题标题】:Django AttributeError and query does not exist errorDjango AttributeError 和查询不存在错误
【发布时间】:2018-09-28 15:14:20
【问题描述】:

文件“C:\Users\NICSI\Desktop\lastnow\mynew\cheque\models.py”,第 39 行,在 st r return (self.related.relation.username).title() AttributeError:“NoneType”对象没有属性“关系” [28/Sep/2018 12:36:49]“GET /admin/cheque/mycheque/HTTP/1.1”500 301999 异常值:
标志匹配查询不存在。 DJANGO 抛出这两个错误我该如何解决这个问题以显示用户和这些细节之间的关系

models.py
class Signs(models.Model):
    	relation = models.OneToOneField(User, on_delete=models.CASCADE)
    	department = models.CharField(null=True, blank=True, max_length=1000, help_text="User Department")
    	mobile = models.CharField(null=True, blank=True, max_length=1000, help_text="User Mobile")

    	
    	def __str__(self):
    		return (self.relation.username).title()
    	class Meta:
    			verbose_name_plural = "Registration Information"
    class Mycheque(models.Model):
    	related = models.ForeignKey(Signs, on_delete=models.CASCADE, null=True, blank=True)
    	to_pay = models.CharField(max_length=250, null=True, blank=True)
    	amount = models.BigIntegerField(default=0, null=True, blank=True)
    	amount_in_words = models.CharField(max_length=10000, null=True, blank=True)
    	vouchar_no = models.BigIntegerField(default=0, null=True, blank=True)
    	dated = models.DateTimeField(auto_now_add=True, null=True, blank=True)
    	cheque_no = models.BigIntegerField(default=0, null=True, blank=True)
    	cheque_date = models.CharField(max_length=10, null=True, blank=True)
    	account_no = models.BigIntegerField(default=0, null=True, blank=True)
    	
    	def save(self):
    			self.dated = datetime.now()
    			super(Mycheque, self).save()
    	
    	def __str__(self):
    		return (self.related.relation.username).title()
    	class Meta:
    			verbose_name_plural = "Single Cheque Of Users"
    			
views.py
    def mycheque(request):
    		if request.method == "POST":
    			userdata = User.objects.get(username = request.user)
    			user_data = Signs.objects.get(relation_id=userdata.id)
    			if userdata.check_password(passwd) == True:
    				to_p = request.POST['topay']
    				amnt = request.POST['amount1']
    				amnt_in_words = request.POST['amount_string']	
    				vouch_no = request.POST['voucharno']
    				d = request.POST['date'] 
    				cheq_no = request.POST['chequeno']
    				cheq_date = request.POST['chequedate']
    				acc_no = request.POST['accountno']
    				single = Mycheque(to_pay=to_p, amount=amnt, amount_in_words=amnt_in_words, vouchar_no=vouch_no, dated=d, cheque_no=cheq_no, cheque_date=cheq_date, account_no=acc_no)
    				single.save()
    				messages.success(request, "Your Cheque is created")	
    					
    		else:
    			messages.error(request, "Please Try again...")
    		return render(request, 'cheque/mycheque.html', {})			
    			

【问题讨论】:

  • 你能分享完整的回溯吗?
  • 是的,我分享错误图片
  • 为什么简单地复制问题中的文字如此困难?
  • 好的,我会这样做

标签: django django-models django-views


【解决方案1】:

AttributeError

错误源于Mycheque.related 关系可以为空:可以将其设置为NULL

这意味着对于某些Mycheques,self.related 对象将是None,因此self.related.relation 会出错。

您将因此向__str__ 添加一些逻辑来处理这种情况,例如:

def __str__(self):
    if self.related:
        return self.related.relation.username.title()
    else:
        return 'no related!'

话虽如此,我发现__str__ 函数相当“奇怪”:Mycheque 的文本表示只考虑了related.relation 对象?所以你应该考虑重新设计这个。

相同的“scanario”可能发生在多个地方,因此您应该运行搜索并相应地修复它

Singns 不存在

这可能是由于以下行:

user_data = Signs.objects.get(relation_id=userdata.id)

奇怪的是,您根本没有对 user_data 变量做任何事情,因此 - 如果您正确实现了视图 - 可以删除该行。

话虽这么说,这条线本身没有意义:您反过来查询ForeignKey,这意味着对于User 对象,可以有零个、一个或多个Signs 对象。所以使用.filter(..) 更有意义,因为如果没有相关的Signs(或多个),此查询将出错。

重构视图,引入ModelForm

上面一行:

userdata = User.objects.get(username = request.user)

也没有意义:request.user User 对象,所以它等价于:

userdata = request.user

视图中的其他特点是您自己执行身份验证,而不是使用@login_required [Django-doc],而且这里定义ModelForm [Django-doc]绝对有意义,通过使用表单,视图可能会减少到5 -7 行,错误在正确的地方处理。

【讨论】:

  • @login_required(login_url="/login/") 我用这个进行身份验证
  • @MõñaSingh:如果您编写了自定义身份验证系统,那么您应该使用reverse_lazy(..) 映射到视图,如果没有,@login_required 就足够了。
  • 但我想听听谁将创建将保存在该特定用户帐户中的支票听不会向所有其他用户显示我为什么要建立关系听但是当我使用上面没有相关时所有详细信息都保存在没有相关领域
  • 我的意思是如果你是用户,你的信息是机密的,只有你不公开
  • @MõñaSingh:在你看来,passwd 是什么并不清楚(看起来它根本不存在)。此外,@login_required 的重点在于它完全执行了这一点。最后,您的视图根本不链接注册用户。您需要在构造中传递引用,这是不可能的,因为您也没有构造 Signs 对象。
猜你喜欢
  • 2013-07-22
  • 2015-04-20
  • 2021-07-26
  • 2021-12-26
  • 1970-01-01
  • 1970-01-01
  • 2011-07-27
  • 1970-01-01
相关资源
最近更新 更多