[英]Can i have help on how i can save a foreignkey in a model?
I have two models Order
and OrderItem
. 我有两个模型Order
和OrderItem
。
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. 这就是我要做的。
Add a new field to your OrderItem: 在您的OrderItem中添加一个新字段:
order_uuid = models.CharField(max_length=25, blank=False, null=True)
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()
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, …)
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()
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.