简体   繁体   English

我可以在如何将外键保存到模型中获得帮助吗?

[英]Can i have help on how i can save a foreignkey in a model?

I have two models Order and OrderItem . 我有两个模型OrderOrderItem

The process to make an order starts with the OrderItem model. 下订单的过程始于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 represents an item and is a modelform with one field being quantity others are excluded i validate the form and create the item like so, OrderItem代表一个项目,并且是一个模型表单,其中一个字段是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))

the function called after is_valid ie order.add_to_order creates and saves an item. is_valid之后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()

when a customer is done creating an item(in the database), they fill in a form which is Order 当客户完成一个项目的创建(在数据库中)时,他们填写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 is a modelform that i validate and save like so. Order是我可以验证并保存的模型形式。

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))

i should point out that OrderItem is called before Order ..much of where the confusion is coming from to return all OrderItem objects related to Order i do as suggested by the django documentation https://docs.djangoproject.com/en/dev/topics/db/queries/#following-relationships-backward 我应该指出, OrderItem是在Order ..之前调用的,这是混乱的根源,它会返回所有与Order i相关的OrderItem对象,如django文档https://docs.djangoproject.com/en/dev/所建议的那样topic / db / queries /#following-relationships-backward

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

I am thinking its empty because i didnt save the foreignkey, but i am really confused about how to go about that. 我以为它是空的,因为我没有保存外键,但是我对如何解决这个问题感到非常困惑。 Any help is appreciated.. 任何帮助表示赞赏。

You just need to pass in (or somehow obtain) the object for the order. 您只需要传递(或以某种方式获得)订单的对象。

Assuming the PK of the order is in your POST vars, you could do this: 假设订单的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), …)

Based on your comment below though, you're creating your order AFTER you create the orderitem , making the code above pointless. 基于以下虽然,您建立您的评论order后,您创建orderitem ,使得上面毫无意义的代码。

If the order hasn't been created yet, there's absolutely no way for you to tie the order item to the order. 如果尚未创建订单,则绝对没有办法将订单项绑定到订单。 At least not without doing something else. 至少并非没有做其他事情。

Here's what I'd do. 这就是我要做的。

  1. Add a new field to your OrderItem: 在您的OrderItem中添加一个新字段:

     order_uuid = models.CharField(max_length=25, blank=False, null=True) 
  2. When you start your order process (wherever you start it), create a UUID using python's uuid package: 当您开始订购过程时(无论在哪里开始),请使用python的uuid包创建一个UUID:

     import uuid temporary_order_uuid = uuid.uuid4() 
  3. Pass this value through each of your order steps, final saving it to the orderitem when you create it. 通过每个订单步骤传递此值, orderitem在创建时将其最终保存到orderitem

     oi=OrderItem.objects.create(order_uuid=temporary_order_uuid, …) 
  4. After you create your order , go back and update all orderitems that contain that uuid with the order's pk: 您创建后order ,回去和更新所有orderitems包含与订单的Pk的UUID:

     order_items = OrderItems.objects.get(order_uuid=temporary_order_uuid) for oi in order_items: oi.order = order oi.save() 
  5. A much cleaner solution would be to create your orderitems AFTER you create the order in the database, but I don't know all the various requirements of your app. 一个更清洁的解决方案是创建你orderitems后,您在数据库中创建的顺序,但我不知道你的应用程序的所有各种要求。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM