2010-12-30 27 views
7

Tôi đang triển khai một ứng dụng e-shop nhỏ trong django. lo ngại Câu hỏi của tôi mô hình hóa một thứ tự với nhiều OrderLines: Làm thế nào để mô hình theo thứ tự để OrderLines mối quan hệ với OrderLines truy cập trực tiếp từ theo thứ tự, tức làDjango OneToMany

Order 
    def addOrderLine 
    def allOrderLines 

tôi muốn truy cập các OrderLines từ theo thứ tự và không phải lấy chúng từ db trực tiếp. Django cung cấp khả năng xác định ForeignKeys, nhưng điều này không giải quyết vấn đề của tôi, bởi vì tôi sẽ phải xác định như sau:

class OrderLine(models.Model): 
    order = models.ForeignKey(Order) 

Với định nghĩa này, tôi sẽ phải lấy OrderLines trực tiếp từ db và không thông qua Lệnh.

Tôi có thể sử dụng định nghĩa này và cung cấp các phương thức ở cấp độ Order. Tuy nhiên, điều đó không làm việc vì nếu tôi xác định Order trên OrderLine trong file models.py, các Order không thấy OrderLines

Trả lời

6

Nếu tôi hiểu được điều này một cách chính xác bạn đang tìm kiếm các nghịch đảo của nhiều người một ví dụ: một người truy cập cung cấp cho bạn một bộ tất cả orderlines trên order.

May mắn thay, hành động tạo liên kết nhiều người thực hiện điều này cho bạn. Hãy thử cách này:

o = Order.objects.get(id=X) 
lines = o.orderline_set.all() 

dòng bây giờ sẽ chứa toàn bộ các dòng đơn hàng được liên kết. Nó dường như không được tài liệu rộng rãi, nhưng nếu bạn đọc mã ví dụ trong many-to-one documentation chặt chẽ, bạn sẽ thấy chức năng này được sử dụng mọi lúc.

Ghi chú:

  • Chữ thường orderline là cố ý, đó là trường hợp luôn luôn thấp hơn.
+0

thanks a lot này một cách hoàn hảo trả lời câu hỏi của tôi! – paweloque

8

Bạn muốn có một ForeignKey đến Order từ OrderLine. Một cái gì đó như thế này:

from django.db import models 

class Order(models.Model): 
    created_at = models.DateTimeField(auto_now_add=True) 

class OrderLine(models.Model): 
    order = models.ForeignKey(Order, related_name='orderlines') 
    name = models.CharField(max_length=30) 

    def __unicode__(self): 
     return self.name 

# Create a new order in the DB: 
>>> order = Order.objects.create() 
# Add a few items to this order: 
>>> order.orderlines.create(name='Candied Yams') 
<Candied Yams> 
>>> order.orderlines.create(name='Minty loin of Lamb') 
<Minty loin of Lamb> 
# Get all items for this order: 
>>> order.orderitems.all() 
[<Candied Yams>, <Minty loin of Lamb>] 

này được pretty well documented hành vi :)

Các vấn đề liên quan