我正在使用django,在将数据插入表格时会产生错误,如下所示......
错误:
int() argument must be a string, a bytes-like object or a number, not 'Tbl_rule_category', How can we solve such error?
view.py
dataToRuleCtgry = Tbl_rule_category(category=category, created_by="XYZ",created_date=datetime.date.today())
dataToRuleCtgry.save()
dataToRule = Tbl_rule(rule_name=rule_name, closure=closure,category_id=Tbl_rule_category.objects.latest('category_id'), created_by="XYZ",created_date=datetime.date.today(), updated_by="XYZ", updated_date=datetime.date.today(), rule_type=rule_type, fk_tbl_rule_tbl_rule_category_id=Tbl_rule_category.objects.latest('category_id'))
dataToRule.save()
models.py
class Tbl_rule_category(models.Model):
category_id = models.AutoField(primary_key=True)
category = models.CharField(max_length=50)
created_by = models.CharField(max_length=50)
created_date = models.DateField(auto_now_add=True)
def __str__(self):
pass # return self.category, self.created_by
class Tbl_rule(models.Model):
rule_id = models.AutoField(primary_key=True)
rule_name = models.CharField(max_length=50)
closure = models.CharField(max_length=50)
category_id = models.IntegerField()
created_by = models.CharField(max_length=50)
created_date = models.DateField(auto_now_add=True)
updated_by = models.CharField(max_length=50)
updated_date = models.DateField(auto_now=True)
rule_type = models.CharField(max_length=50)
fk_tbl_rule_tbl_rule_category_id = models.ForeignKey(Tbl_rule_category,on_delete=models.CASCADE, related_name='fk_tbl_rule_tbl_rule_category_id_r')
def __str__(self):
return self.rule_name, self.closure, self.created_by, self.updated_by, self.rule_type
答案 0 :(得分:1)
发生错误是因为以下是尝试将对象添加到整数字段中:category_id=Tbl_rule_category.objects.latest('category_id')
您只需添加:category_id=dataToRuleCtgry.get('category_id')
或category_id=dataToRuleCtgry.category_id
即可解决错误。
您也不需要添加:created_date=datetime.date.today()
,因为您的模型定义了auto_now = true。
如前所述,您还应修改def __str__(self):
以返回字符串。
https://docs.djangoproject.com/en/2.0/ref/models/instances/#django.db.models.Model.str
您可以直接将对象链接添加到类别模型的外键中。fk_tbl_rule_tbl_rule_category_id=dataToRuleCtgry
。您将不再需要整数字段category_id。
最好使用模型字段名称category_id而不是fk_tbl_rule_tbl_rule_category_id。这意味着删除category_id,然后将fk_tbl_rule_tbl_rule_category_id重命名为category_id。
答案 1 :(得分:-1)
在Django中,ORM会为您处理基本的数据库详细信息;这意味着在您的代码中,您实际上不必担心用于维护外键关系的各个行ID。
事实上,Django会自动为所有对象分配主键,因此您应该专注于与您的应用程序相关的字段。
您也不必担心数据库中的命名字段,Django将再次为您处理这一点 - 您应该创建具有对用户有意义的字段的对象(包括你作为系统的程序员而不是为数据库设计的。
每个Django模型类代表系统中的一个对象。因此,您应该像命名对象一样命名类。 User
而非tbl_user
。最佳做法是使用单数名称。 Django已经知道如何创建复数名称,所以如果你创建一个模型类User
,django会在任何有意义的地方自动显示Users
。当然,您可以自定义此行为。
以下是您应该如何创建模型(我们稍后会定义__str__
):
class RuleCategory(models.Model):
name = models.CharField(max_length=50)
created_by = models.CharField(max_length=50)
created_date = models.DateField(auto_now_add=True)
class Rule(models.Model):
name = models.CharField(max_length=50)
closure = models.CharField(max_length=50)
created_by = models.CharField(max_length=50)
created_date = models.DateField(auto_now_add=True)
updated_by = models.CharField(max_length=50)
updated_date = models.DateField(auto_now=True)
rule_type = models.CharField(max_length=50)
category = models.ForeignKey(RuleCategory,on_delete=models.CASCADE)
Django将自动创建任何主键或外键字段,以及管理两个模型之间关系所需的任何中间表。
现在,添加一些记录:
new_category = RuleCategory(name='My Category', created_by='XYZ')
new_category.save()
# Another way to set values
new_rule = Rule()
new_rule.name = 'Sample Rule'
new_rule.closure = closure
new_rule.created_by = 'XYZ'
new_rule.updated_by = 'XYZ'
new_rule.rule_type = rule_type
new_rule.category = new_category
new_rule.save()
注意这一行new_rule.category = new_category
- 这是我们链接两个对象的方式。 Django知道主键应该放在表中并自动处理。
最后一项是通过创建自己的__str__
方法来自定义模型 - 这应该返回一些有意义的字符串,用于人类。
class RuleCategory(models.Model):
name = models.CharField(max_length=50)
created_by = models.CharField(max_length=50)
created_date = models.DateField(auto_now_add=True)
def __str__(self):
return '{}'.format(self.name)
class Rule(models.Model):
name = models.CharField(max_length=50)
closure = models.CharField(max_length=50)
created_by = models.CharField(max_length=50)
created_date = models.DateField(auto_now_add=True)
updated_by = models.CharField(max_length=50)
updated_date = models.DateField(auto_now=True)
rule_type = models.CharField(max_length=50)
category = models.ForeignKey(RuleCategory,on_delete=models.CASCADE)
def __str__(self):
return '{} for category {}'.format(self.name, self.category)
如果您发现了某些问题,我只需将self.category
放入__str__
模型Rule
。这是因为我们已经为__str__
模型定义了RuleCategory
,它只返回类别名称;所以现在当我们打印我们创建的规则时,我们将得到Sample Rule for category My Category
。