2013-02-27 2 views
0

У меня есть две модели: Order и OrderItem.Могу ли я получить помощь о том, как я могу сохранить чужой ключ в модели?

Процесс изготовления заказа начинается с модели 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,null=True,blank=True) 

OrderItem представляет элемент и является ModelForm с одним полем является quantity другими excluded я проверить форму и создать элемент, как это так,

def show_item(request,id): 
    # need to evaluate the HTTP method 
    if request.method == 'POST': 
     a = Item.objects.get(pk=id) 
     form = PartialOrderItemForm(request.POST,instance=a) 
     # check validation of posted data 
     if form.is_valid(): 
      order.add_to_order(request,a) 
      # if test cookie worked, get rid of it 
      if request.session.test_cookie_worked(): 
       request.session.delete_test_cookie() 
      url =urlresolvers.reverse('order_index') 
      # redirect to order page 
      return HttpResponseRedirect(url) 
    else: 
     form = PartialOrderItemForm() 
    request.session.set_test_cookie() 
    context={ 

     'form':form, 

    } 
    return render_to_response('item.html',context,context_instance=RequestContext(request)) 

функции под названием после is_valid т.е. order.add_to_order создает и сохраняет элемент.

def add_to_order(request,obj): 
    postdata = request.POST.copy() 
    #get quantity added, return 0 if empty 
    quantity = postdata.get('quantity',0) 
    # fetch the item or return missing page error_message 
    i = get_object_or_404(Item,pk=obj.id) 
    # get items in order 
    order_items = get_order_items(request) 
    item_in_orders = False 
    # check to see if item is already in order 
    for order_item in order_items: 
     if order_item.item.id == i.id: 
      #update the quantity if found 
      order_item.augment_quantity(quantity) 
      item_in_orders = True 
    if not item_in_orders: 
     # creat and save a new order item 
     anon_user = User.objects.get(id=settings.ANONYMOUS_USER_ID) 
    oi=OrderItem.objects.create(shopping_id=_shopping_id(request), 
              quantity=quantity, 
              item=i, 
              created_by=anon_user, 
              modified_by=anon_user) 
    oi.save() 

, когда клиент сделал создание элемента (в базе данных), они заполняют форму, которая Order

class Order(SmartModel): 
    #each individual status 
    SUBMITTED = 1 # the credit card was valid or mobilemoney was recieved.It is ready for us to process the order 
    PROCESSED = 2 # After submitted orders are reviewed, we can mark them as processed, letting deliverers know order is ready to be shipped 
    DELIVERED = 3 # the order has been processed and approved by the adminstrator(in this case us), it is delivered. 
    PICKED_UP =4 # the order has been processed and is picked up by customer 
    CANCELLED = 5 # Customer called the company and decided they didnt want to go through with the order either by phone or email. 

    # SET OF POSSIBLE STATUSES 
    ORDER_STATUSES = ((SUBMITTED,'Submitted'),(PROCESSED,'Processed'),(DELIVERED,'Delivered'),(PICKED_UP,'picked_up'),(CANCELLED,'Cancelled'),) 
    #Order info 
    date = models.DateTimeField(auto_now_add=True) 
    status = models.IntegerField(choices=ORDER_STATUSES, default=SUBMITTED) 
# customer = models.ForeignKey(Customer,null=True,blank=True,help_text="The customer who made this order",default=None,) 
    restaurant = models.ForeignKey(Restaurant,null=True,blank=True,default = None,help_text="The restaurant the customer order from") 
    #contact info 
    email = models.EmailField(max_length=50,help_text="Needed as alternative") 
    mobile = PhoneNumberField(max_length=20,default='+25078######',help_text="Needed to communicate and confirm payment from mobile money") 

    #billing information 
    billing_name= models.CharField(max_length=50,help_text="Needed so we can deliver to the right individual") 

    billing_address= models.CharField(max_length=50,help_text="Needed for delivery purposes, should be office address.")  
    billing_city = models.CharField(max_length=50,help_text="F4L services are only in selected cities.") 

Order является ModelForm, что я проверить и сохранить как так.

def show_checkout(request): 
    if order.is_empty(request): 
     cart_url = urlresolvers.reverse('order_index') 
     return HttpResponseRedirect(cart_url) 
    if request.method == 'POST': 
     postdata = request.POST.copy() 
     form = forms.CheckoutForm(request.POST,postdata) 
     if form.is_valid(): 
      anon_user = User.objects.get(id=settings.ANONYMOUS_USER_ID) 
      obj = form.save(commit=False) 
      obj.created_by = anon_user 
      obj.modified_by = anon_user 
      obj.save() 
      if postdata['submit'] == 'place order': 
       reciept_url = urlresolvers.reverse('checkout_reciept') 
       return HttpResponseRedirect(reciept_url) 
    else: 
     form = forms.CheckoutForm 
    context = { 
     'form':form, 
    } 
    return render_to_response('checkout/checkout.html',context,context_instance=RequestContext(request)) 

я должен отметить, что OrderItem вызывается перед Order ..much, где путаница происходит из вернуть все OrderItem объекты, связанные с Order я делать, как предложено в документации Джанго https://docs.djangoproject.com/en/dev/topics/db/queries/#following-relationships-backward

>>> from orders.models import OrderItem,Order 
>>> a = Order.objects.get(id=1) 
>>> a 
<Order: blah blah [email protected] +250780000000 1 2013-02-26 17:25:23.138738+00:00> 
>>> a.orderitem_set.all() 
[] 

Я думаю, что он пуст, потому что я не сохранил чужой ключ, но я действительно запутался в том, как это сделать. Любая помощь приветствуется.

+0

метод add_to_order для модели заказа? –

+0

нет на модели 'OrderItem'. –

+0

доброжелательное предложение, вы можете упростить свой вопрос, так как есть много текста/кода, чтобы разобрать там^ –

ответ

0

Вам просто нужно передать (или как-то получить) объект для заказа.

Предполагая PK порядка в вашем Варсе POST, вы можете сделать это:

def add_to_order(request,obj): 
    postdata = request.POST.copy() 
    order = Order.objects.get(pk=postdata.get('order_id')) 
    … 
     oi=OrderItem.objects.create(order=order, shopping_id=_shopping_id(request), …) 

Основываясь на ваш комментарий ниже, хотя, вы создаете ваш order после создания orderitem, что делает код выше бессмысленно.

Если заказ еще не создан, вы не сможете привязать его к заказу. По крайней мере, не делая ничего другого.

Вот что я буду делать.

  1. Добавить новое поле в вашей OrderItem:

    order_uuid = models.CharField(max_length=25, blank=False, null=True) 
    
  2. При запуске процесса заказа (там, где вы начинаете его), создать UUID с помощью uuid пакета питона:

    import uuid 
    temporary_order_uuid = uuid.uuid4() 
    
  3. Передайте это значение через каждый из шагов вашего заказа, окончательно сохранив его до orderitem при его создании.

    oi=OrderItem.objects.create(order_uuid=temporary_order_uuid, …) 
    
  4. После создания order, вернитесь назад и обновить все orderitems, которые содержат, что UUID с рк ордена:

    order_items = OrderItems.objects.get(order_uuid=temporary_order_uuid) 
    for oi in order_items: 
        oi.order = order 
        oi.save() 
    
  5. Гораздо чище решение было бы создать orderitems после создания заказ в базе данных, но я не знаю всех различных требований вашего приложения.

+0

Я не думаю, что это работает с gon, потому что Pk порядка не находится в 'postdata'. извините, я не упоминал, что 'Order' создается после OrderItem. но эй, позвольте мне просто попробовать ... –

+0

Ну, тогда это не сработает. Если вы создадите заказ ПОСЛЕ создания OrderItem, у вас возникнет проблема. Я обновляю свой ответ с идеей. –

+0

well am gon проверить это, это может занять меня когда-нибудь, но когда я закончил, я опубликую его или нет .... спасибо за ваше время. –

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