2010-03-31 93 views
0

ForeignKey的Django的1.1.1模型

class staff_name(models.Model): 

    firstname = models.CharField(max_length=150) 
    surname = models.CharField(max_length=150) 



class inventory_transaction(models.Model): 

    staffs = models.ForeignKey(staff_name) 

我想还是通过inventory_transaction在员工姓氏和名字

我用下面

inventory_transaction.objects.get_or_create(staffs__surname__contains=sname,staffs__firstname__contains=fname) 

这些代码,我得到这个错误"staffs__surname__contains can not be defined"

我做错了什么?

感谢

+0

@Spikie:这里的要求;请使用大写字母作为专有名词,如“I”。你可以更新你的问题以使其可读,如果你的问题看起来不错,你可能会得到更好的答案。 – 2010-03-31 14:07:08

+0

好的......好的,谢谢 – Spikie 2010-03-31 14:12:00

回答

2

基于HMM的get_or_create()文件上:

在英语中,这意味着开始与任何非'defaults'关键字的论点,即不包含双下划线(这将表示非精确查找)

我想说你想做什么是不可能的,因为你的查询可能返回多个结果。传递给get_or_create()的参数必须以返回唯一结果的方式进行。

你可以尝试__exact而不是__contains

inventory_transaction.objects.get_or_create(staffs__surname__exact=sname,staffs__firstname__exact=fname) 

但我不认为get_or_create()可以自动创建外键的对象。

所以可能在这种情况下,最简单的事情是这样的:

try: 
    itrans = inventory_transaction.objects.get(staffs__surname__contains=sname,staffs__firstname__contains=fname) 
except inventory_transaction.DoesNotExist: 
    staff = staff_name(firstname=fname, surname=sname) 
    staff.save() 
    itrans = inventory_transaction(staffs=staff) 
    itrans.save() 

顺便说一下常见的做法是利用资本名称类和我不会用下划线,因为他们也是在DB查找使用。也就是说,把你的班级重命名为StaffNameInventoryTransaction

+0

好的,谢谢Felix! – Spikie 2010-03-31 15:32:17