1

В моем приложении есть клиенты, у каждого из которых есть один профиль фактурирования.Django: Как определить отношения модели для достижения следующего:

Я представляя мое приложение имея модель «Client» с атрибутом под названием «billing_profile», который будет ссылаться на другую модель под названием «BillingProfile». Вместо определения «BillingProfile» с внешним ключом обратно в «Клиент» (то есть «client = models.ForeignKey (Клиент)»), я думал, что, поскольку для каждого клиента будет только один профиль фактурирования, Вместо этого я мог бы использовать поле «один-к-одному». Кажется ли это логичным делать, или это кажется обратным (тогда мне нужно было бы создать BillingProfile до того, как вы установили клиент). Есть ли хороший способ сделать это в сравнении с моей парадигмой понимания этого?

ответ

1

Я понял.

OneToOneField() можно искать в обоих направлениях с помощью простого метода атрибутов.

Пример:

Модели:

class Client(models.Model): 
    ... stuff ... 


class BillingProfile(models.Model): 
    client = models.OneToOneField('Client') 
    ... stuff ... 

Теперь я могу сделать что-либо из них:

spam_client.billingprofile # returns related BillingProfile Instance 

или

spam_billingprofile.client # returns related Client instance 

Это означает, что я не должен создайте экземпляр BillingProfile до тех пор, пока я ' м, но у меня все еще есть те преимущества, которые у меня были бы, если бы у Клиента был атрибут billingprofile, а не наоборот.

Другими словами: я думал об этом раньше, но не слишком назад.

2

Это способ сделать это, если вы уверены в его отношениях друг к другу. , например, может ли быть клиент с 2 биллинговых профилей: один для личного пользования, так и для его бизнеса, & гр ...

Это не назад, потому что с помощью один к одному, или с помощью внешнего ключа не влияет на порядок создания (в обоих вы можете сначала создать профиль или создать клиента сначала, а затем связать их).

+0

Thanks Ofri. Как я могу создать клиент без его атрибута billing_profile (т. Е. Без его создания BillingProfile), если только A) я не использовал blank = True (который я хочу, чтобы все клиенты имели BillingProfile) или B) Я использую save (commit = False) на моем новом Клиенте, затем создайте BillingProfile и добавьте его клиенту, а затем снова используйте save() на клиенте. Я думаю, что все это неправильно? – orokusaki

+0

Это 2 способа сделать это. еще несколько идей можно найти здесь: http://stackoverflow.com/questions/1652550/can-django-automatically-create-a-related-one-to-one-model –