2013-02-28 3 views
0

У меня есть две модели: Order и OrderItem.Как мне сэкономить внешний ключ?

class OrderItem(SmartModel): 
    shopping_id = models.CharField(max_length=50,db_index=True) 
    quantity = models.IntegerField(default=0) 
    item = models.ForeignKey(Item) 
    order = models.ForeignKey(Order) 

это, как я создавать и сохранять OrderItem объект

if not item_in_orders: 
     # creat and save a new order item 
     anon_user = User.objects.get(id=settings.ANONYMOUS_USER_ID) 
     try: 
      order= Order.objects.get(pk=order_id) 
     except: 
      order = Order.objects.create(created_by=anon_user,modified_by=anon_user) 

     oi=OrderItem.objects.create(order=order,shopping_id=_shopping_id(request), 
              quantity=quantity, 
              item=i, 
              created_by=anon_user, 
              modified_by=anon_user) 
     oi.save() 

Теперь я должен отметить, что OrderItem объект выше создается перед Order объекта.

class Order(SmartModel): 
    email = models.EmailField(max_length=50,help_text="Needed as alternative") 
    mobile = PhoneNumberField(max_length=20,default='+2507####') 
    billing_name= models.CharField(max_length=50) 
    billing_address= models.CharField(max_length=50)  
    billing_city = models.CharField(max_length=50) 

обе модели ModelForms и проверяются в порядке, за исключением того, когда две созданы две строки в базе данных создаются для Order. Первая строка, которая не заполняется, я подозреваю, создается этим кодом при создании OrderItem.

order = Order.objects.create(created_by=anon_user,modified_by=anon_user) 

      oi=OrderItem.objects.create(order=order,shopping_id=_shopping_id(request), 
               quantity=quantity, 
               item=i, 
               created_by=anon_user, 
               modified_by=anon_user) 
      oi.save() 

Вторая строка создается, когда я сохранить Order объект и отлично.

Имейте в виду, что OrderItem создан до Order, а позднее это поле с иностранными ключами в первом.

Мое требование для моего приложения django заключается в том, что элемент заказа создается перед клиентом (в моем случае Order). Любые другие идеи приветствуются.

+0

Какова роль 0f i? – masterofdestiny

+0

Как создать элемент заказа перед заказом? элемент заказа нуждается в заказе внешнего ключа – catherine

+0

@masterofdestiny 'i' - это переменная с меткой, содержащая элемент, изменит свое имя, но это не проблема, я могу вас заверить. Я опубликовал меньше кода, обычно я не получаю много помощи из-за размещения слишком большого количества кода в моих вопросах. поэтому я разместил необходимые данные. –

ответ

0

OK Как вы сказали

Имейте в виду, что создается OrderItem перед заказом и позже это ForeignKey поле в первом.

Тогда в этом случае вы должны разработать свою модель, как

class OrderItem(SmartModel): 
    shopping_id = models.CharField(max_length=50,db_index=True) 
    quantity = models.IntegerField(default=0) 
    item = models.ForeignKey(Item) 
    order = models.ForeignKey(Order,blank=True,null = True) 

Здесь я даю вам, как вы можете сохранить Foreign key значение в таблице

В запросе

order = Order.objects.create(created_by=anon_user,modified_by=anon_user) 

      oi=OrderItem.objects.create(order=order,shopping_id=_shopping_id(request), 
               quantity=quantity, 
               item=i, 
               created_by=anon_user, 
               modified_by=anon_user) 
      oi.save() 

I не знаю, что такое i Но если вы собираетесь сохранить внешний ключ, тогда i должен мне указать Item

Я просто рассматриваю простой пример, если вы получаете форму itemname из формы, сначала вам необходимо отфильтровать ее в таблице Item.

Как getitem = Item.objects.get(name= itemname)

И тогда вы можете сохранить внешний ключ, как

order = Order.objects.create(created_by=anon_user,modified_by=anon_user) 

      oi=OrderItem.objects.create(order=order,shopping_id=_shopping_id(request), 
               quantity=quantity, 
               item=getitem, 
               created_by=anon_user, 
               modified_by=anon_user) 
      oi.save() 
0

Похоже, вы

  1. Создание пустой, чтобы спасти с OrderItem (для удовлетворения внешний ключ)
  2. Создание еще одного полностью заполненного заказа после создания OrderItem (поскольку вы указываете, что заказ создан fter OrderItem). Я предполагаю, что это не показано в вашем коде выше.

Именно поэтому вы видите два экземпляра заказа.

Вместо того, чтобы создавать новый заказ во второй раз (шаг 2), вы можете обновить заказ, созданный на шаге 1, с информацией о заказе, такой как адрес электронной почты, адрес и т. Д. И сохранить его.

EDIT: Добавлены подробные инструкции по ...

Там будет какое-то место в коде, где вы создаете второй порядок. Вместо создания нового ордера используйте ссылку на заказ, созданный на шаге 1 (переменная заказа в отправленном вами коде), обновите ее с помощью электронной почты и адресной информации, как только она будет доступна, и вызовите save() на ней. Это приведет к обновлению порядка в базе данных вместо создания нового экземпляра.

+0

Вы, мой друг, поняли мою проблему (сумасшествие), что вам нужно увидеть из моего кода в помогите мне решить эту проблему. Я отправил меньше кода, чтобы не ронять людей. –

+0

Я добавил более подробную информацию. Надеюсь, это даст понять, как вы можете решить проблему. –

0
order = Order.object.create(
    created_by=anon_user, 
    modified_by=anon_user 
    ) 


OrderItem.object.create(
    order = order, 
    shopping_id = _shopping_id(request), 
    quantity=quantity, 
    item=i, 
    created_by=anon_user, 
    modified_by=anon_user 
    ) 

//To access the order after saving the above info 
//For example: 

order.email = '[email protected]' 
order.save() 
+0

i get error, '' NoneType 'объект не имеет атрибута' id'' ... –

+0

@Mats_invasion ok ответить обновлено – catherine

+0

uhmm..that не работает, создает три строки в базе данных..ok, какой другой способ возвратит детали заказа и информации клиентов как один объект без использования внешнего ключа. –

Смежные вопросы