存储外键,不是来自表单POST方法,而是存储我已经拥有的表单数据

时间:2013-09-13 15:55:21

标签: python mysql django

我通过表单POST方法存储'payment'模型实例但我已经拥有了外键字段的数据,因为我来自列出'student'模型对象的页面。我通过input type =“hidden”html元素存储外键字段。

但是当我提交时,它会显示错误

> Cannot assign "u'1'": "payment.student" must be a "student" instance.
> Request Method:   POST
> Django Version:   1.5.2
> Exception Type:   ValueError
> Exception Value:  
> Cannot assign "u'1'": "payment.student" must be a "student" instance.
> Exception Location:   /usr/local/lib/python2.7/dist-> > > > >packages/django/db/models/fields/related.py in __set__, line 405
>Python Executable: /usr/bin/python
>Python Version:    2.7.3

这是我的模特:

class payment(models.Model):
    Id = models.AutoField(primary_key=True)
    student = models.ForeignKey('student',db_column='student')
    dateTime = models.DateField(auto_now_add=True)
    amountDue = models.DecimalField(max_digits=5, decimal_places=2)

我后来添加了db_column='student',但它可能在mysql数据库中没有真正生效。

1 个答案:

答案 0 :(得分:0)

请勿尝试为int分配payment.student。 分配student个实例。

payment.student = student.get(pk=1) # Desired value `1` for foreign key assumed

此外,您应遵循编码样式规则(阅读PEP8):

  • 以大写字母开头的班级名称
  • 字段名称不以大写字母开头
  • 变量和字段不使用驼峰案例 - 类名称

您的代码将在没有此规则的情况下工作,但作为Python开发人员,我们有一些可读代码标准。

在Django中,您不必定义主键字段 - 它是自动创建的,可通过instance.pk访问。
而且我不确定您是否真的希望外键指向student表的student列。
如果在其他模块中定义了模型,您可以导入student模型。

因此,通过这些更正,您的类定义应该是:

from other_app.models import Student

class Payment(models.Model):
    student = models.ForeignKey(Student)
    date_time = models.DateField(auto_now_add=True)
    amount_due = models.DecimalField(max_digits=5, decimal_places=2)

现在任何Payment实例都有隐含字段pk,它代表主键。 并在您的视图中使用样式更正完成一行:

payment.student = Student.get(pk=1) # Desired value `1` for foreign key assumed
# payment is instance so all lowercase here
# Student on the right side is a class so started with capital