Django: подключение двух моделей через save()

мой проект состоит из двух шагов: 1) вход в базу данных для модели заказа 2) вход в базу данных для профиля транзакции. В то же время 1) будет обновлен внешний ключ до 2)

Я старался сохранить мой view.py как можно более чистым и модифицировал функцию save(). Однако я читал, что это не всегда рекомендуется, и мне было интересно, есть ли у вас какие-либо отзывы о моем подходе ниже или если бы вы сделали это по-другому.

просмотры.py

def checkout_page(request):
    session_order_id = request.session['order_id']

    if request.POST:
        transaction_profile = TransactionProfileModelForm(request, request.POST)
        if transaction_profile.is_valid():
            t = transaction_profile.save(commit=False)
            t.save()
    else:
            transaction_profile = TransactionProfileModelForm(request)

формы.py

from orders.models import Order

class TransactionProfileModelForm(forms.ModelForm):
    email_confirm = forms.EmailField()

    class Meta:
        model=TransactionProfile
        fields = [
            'email',
            'email_confirm',
            'address_line_1',
            'address_line_2',
            'city',
            'country',
            'postal_code',
            'state'
        ]

    def __init__(self, request, *args, **kwargs):
        self.request = request
        super(TransactionProfileModelForm, self).__init__(*args, **kwargs)

    def save(self, commit=True):
        obj = super(TransactionProfileModelForm, self).save(commit=False)
        if commit:
            obj.save()
            request = self.request
            session_order_id = request.session['order_id']
            o = Order.objects.get(order_id=session_order_id)
            o.transaction_profile = obj
            o.save()
        return obj

person Community    schedule 04.05.2018    source источник
comment
Я не уверен, в чем заключается ваш вопрос, но ваша пользовательская логика сохранения никогда не будет вызываться, потому что вы всегда передаете commit=False.   -  person Daniel Roseman    schedule 04.05.2018
comment
Привет @Daniel Roseman, разве это не должно быть так? Я не уверен, что неправильно понял, как это должно быть сделано, но я взял лучший ответ из этого сообщения в качестве ссылки: stackoverflow.com /a/817364/9252255   -  person    schedule 04.05.2018
comment
Как я уже сказал в своем комментарии, вся ваша пользовательская логика защищена if commit. Но вы проходите commit=False. Так что он никогда не будет выполнен. Почему вы все равно используете commit=False?   -  person Daniel Roseman    schedule 04.05.2018
comment
Привет Даниил, о да, теперь я понимаю, что вы имели в виду. Я не знаю, как это туда попало, но вы правы, это должно быть без commit=false в views.py. Я думаю, что это произошло, когда я пытался решить эту проблему с помощью pre_save. Мой вопрос в целом заключался в том, считается ли этот подход здесь «хорошим» или мне следует обновить этот новый Foreign_key непосредственно в views.py или в pre_save   -  person    schedule 04.05.2018
comment
Привет @DanielRoseman, я думаю, это должно сработать, или я что-то неправильно понял? Потому что после t = transaction_profile.save(commit=False) он вызывает t.save(), а метод save() имеет commit=True в качестве значения по умолчанию.   -  person Nepo Znat    schedule 04.05.2018
comment
Нет. Посмотрите, что возвращает ваш метод сохранения: obj, который является экземпляром модели. Итак, t.save() вызывает сохранение модели, а не формы.   -  person Daniel Roseman    schedule 04.05.2018
comment
Ааа теперь понятно, спасибо за объяснение   -  person Nepo Znat    schedule 05.05.2018