我正在使用Django,在将数据插入数据库时​​我发现了这样的错误

时间:2018-03-15 13:14:35

标签: django django-models django-views

我正在使用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

2 个答案:

答案 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