2013-04-22 35 views
0

我使用django-salesforce获取联系人(子)和与其关联的账户(父)的列表。django-salesforce外键语法

在我的models.py中,在Contact类中定义一个字段来保存帐户名称的语法是什么?

这里是我的models.py:

from django.db import models 
from salesforce.models import SalesforceModel 

class Account(SalesforceModel): 
    Name = models.CharField(max_length=255) 

    def __unicode__(self): 
     return u'%s %s' % (self.Name, self.Id) 

class Contact(SalesforceModel): 
    FirstName = models.CharField(max_length=255) 
    LastName = models.CharField(max_length=255) 
    AccountId = models.CharField(max_length=255) 

    def __unicode__(self): 
     return u'%s %s %s' % (self.FirstName, self.LastName, self.AccountId) 

我已经无法找到任何例子,但我想它会是这个样子:

AccountName = models.ForeignKey(Account, db_column='Name') 

回答

1

帐户名不应该被保存在Contact的字段中,因为它已经保存在Account中(这是数据库规范化的目的 - 减少冗余)。从Contact对象c

class Contact(SalesforceModel): 
    FirstName = models.CharField(max_length=255) 
    LastName = models.CharField(max_length=255) 
    Account = models.ForeignKey(Account) 

,并获得帐户名称:Django的销售团队的

c.Account.Name 
+0

谢谢,这个答案是有道理的,它似乎是它应该的工作方式。当我尝试这个时,我得到一个错误: 实体'联系'上没有这样的列'Account_id'。如果您尝试使用自定义字段,请务必在自定义字段名称后面追加'__c'。 – user2262804 2013-04-22 17:22:33

+0

你在哪一行发生错误? – 2013-04-22 17:47:45

+0

嗨,这发生在我manage.py shell时: >>> c = Contact.objects.all() >>> c [0] 我相信发生了什么是django正在追加_id帐户。 – user2262804 2013-04-23 14:51:07

2

我是作者

相反,你会使用一个ForeignKey连接。你不应该做任何事情特别使外键关系工作,虽然你可能需要明确你的关键名称。这里是一个非常简单的例子,在包含在源码包中的示例应用程序中发现:

class User(SalesforceModel): 
    Email = models.CharField(max_length=100) 
    LastName = models.CharField(max_length=80) 
    FirstName = models.CharField(max_length=40) 
    IsActive = models.BooleanField() 

class Account(SalesforceModel): 
    Owner = models.ForeignKey(User, db_column='OwnerId') 

因为默认Salesforce的命名约定比Django的不同,你必须明确地告诉它你的外键字段的名称。否则,它将使用附加'_id'的Django约定,而不是附加'Id'的SF约定。

然后,类似于David回复中提到的那样,您可以访问帐户所有者的名字:

a = models.Account.objects.all()[0] 
print a.Owner.FirstName 
+0

我正在编写基于源代码tarball中的测试的测试。我列出了用户模型。当我添加帐户模型时,出现以下错误:django.db.utils.DatabaseError:(1075,'不正确的表定义;只能有一个自动列,它必须定义为一个键')。我在想,也许DATABASES设置导致了这个问题。我有两个数据库'default':'ENGINE''django.db.backends.mysql'和'salesforce':'ENGINE''salesforce.backend'。你是否认为Django正在看到'默认',并试图将MySQL约束应用到Salesforce表中? – user2262804 2013-11-14 16:52:03

+0

我需要更多的信息才能确定,但​​对我来说这听起来像是一个无效的模型,可能会添加一个重复的字段来表示Salesforce上的“Id”字段。当您从SalesforceModel继承时,您不需要指定主键,因为它会自动添加大多数SFDC模型通用的默认“Id”字段。 – 2014-07-15 20:35:14