2013-04-22 3 views
0

Я использую django-salesforce, чтобы получить список контактов (child) и связанных с ними учетных записей (родительских элементов).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, так как оно уже хранится в Учетной записи (это цель нормализации базы данных - уменьшить избыточность).

Вместо этого можно подключить его с помощью одного ForeignKey:

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

и получить имя учетной записи из Contact объекта c с:

c.Account.Name 
+0

Спасибо, этот ответ имеет смысл, и похоже, что так оно и должно работать. Когда я попробую это, я получаю сообщение об ошибке: Нет такого столбца «Account_id» в сущности «Контакт». Если вы пытаетесь использовать настраиваемое поле, обязательно добавьте «__c» после имени настраиваемого поля. – user2262804

+0

В какой строке вы принимаете эту ошибку? –

+0

Привет, это происходит, когда я делаю manage.py shell: >>> c = Contact.objects.all() >>> c [0] Я верю, что происходит то, что django добавляет _id к учетной записи. – user2262804

2

Я автор Джанго-отдела продаж. Вам не нужно ничего делать слишком специально для работы с внешними ключами, хотя вам, вероятно, нужно будет четко указывать ваши имена ключей. Вот очень простой пример, найденный в примере приложении, содержащемся в исходном тарболле:

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», а не SF-соглашение о добавлении «Id»

Затем, как и в упомянутом ответе Дэвида, вы получите доступ к первому имени владельца учетной записи с помощью:

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

Я пишу тесты, основанные на тестах в исходном tarball. У меня есть модель User, как вы указали. Когда я добавляю модель учетной записи, я получаю следующую ошибку: django.db.utils.DatabaseError: (1075, «Неверное определение таблицы, может быть только один автоматический столбец, и он должен быть определен как ключ»). Я думаю, что, возможно, настройка DATABASES вызывает проблему. У меня две базы данных: «default»: «ENGINE» «django.db.backends.mysql» и «salesforce»: «ENGINE» «salesforce.backend». Как вы думаете, Django видит «default» и пытается применить ограничения MySQL к таблице Salesforce? – user2262804

+0

Мне нужна дополнительная информация, но это звучит для меня, как будто это недопустимая модель, возможно, с дублированным полем, добавленным для представления поля «Идентификатор» в Salesforce. Вам не нужно указывать первичный ключ, если вы наследуете его от SalesforceModel, потому что он автоматически добавляет поле «Id» по умолчанию, обычное для большинства моделей SFDC. –