2014-11-02 34 views
6

Tôi đã đọc tài liệu nhưng vẫn gặp lỗi. Tôi có Người dùng đặt Đơn đặt hàng cho các đối tượng Danh mục. Tôi muốn tạo truy vấn trả về tất cả Người dùng có Đơn đặt hàng chứa một mục Catalogue cụ thể.Các mối quan hệ mở rộng Django

Dưới đây là mô hình của tôi:

class Catalog(models.Model): 
    name = models.CharField(max_length=100) 
    price = models.IntegerField() 

    def __unicode__(self): 
     return self.name 

class Annual(models.Model): 
    catalog = models.OneToOneField(Catalog, blank=True, null=True, related_name='annual_products') 
    year_id = models.IntegerField(max_length=4) 
    start_date = models.CharField(max_length=10) 
    end_date = models.CharField(max_length=10) 
    date = models.DateTimeField(auto_now_add=True, blank=True) 
    def __unicode__(self): 
     return unicode(self.year_id) 

class Order(models.Model): 
    user = models.ForeignKey(User, related_name='who_ordered') 
    select = models.ManyToManyField(Catalog, related_name='annuals_ordered', blank=True, null=True) 

    def __unicode__(self): 
     return unicode(self.user) 

Dưới đây là truy vấn Tôi đã cố gắng:

Catalog.objects.filter(order__select__annual='2014') 

Trả lời

12

Nếu bạn cần người dùng, bạn nên bắt đầu với người dùng. Ngoài ra, bạn cần phải lọc trên một trường cụ thể trong Hàng năm, tức là year_id.

User.objects.filter(order__select__annual__year_id=2014) 
+0

Điều đó có ý nghĩa hơn nhiều, bắt đầu với Người dùng. Cảm ơn. Tôi đã có thể nhận được truy vấn hoạt động chính xác với PK: User.objects.filter (order__select = '2'). Tôi muốn rõ ràng hơn, giống như truy vấn của bạn. Tôi đang trả lại lỗi sau đây mặc dù: Các trường quan hệ không hỗ trợ tra cứu lồng nhau. – byrdr

+0

Ah, không thấy rằng bạn đã xác định liên quan. Hãy thử 'order__select__annual_products__year_id –

+0

Tôi nghĩ rằng đây là đúng cách ... User.objects.filter (who_ordered__select__annual_products__id = 1) hoặc User.objects.filter (who_ordered__select__annual_products = annual_obj) tham chiếu tên liên quan phải phù hợp với từng tham chiếu. Tôi đã cập nhật câu trả lời của mình. –

0

Nếu tôi nhận được câu hỏi của bạn một cách chính xác sau đó, câu hỏi của bạn là sai. Không có tên attributeorder bên trong mô hình Catalog của bạn, sau đó làm thế nào bạn có thể sử dụng nó để lọc? Hoặc tôi đang thiếu gì ở đây?

trực tiếp bằng cách sử dụng tài liệu tham khảo tên có liên quan trên các lĩnh vực liên quan, bạn có thể nhận được những người sử dụng bằng cách sử dụng -

# id is auto generated field or you can pass one annual_product object. 
User.objects.filter(who_ordered__select__annual_products__id=1) 

# OR 
annual = Annual.objects.all()[0] 
User.objects.filter(who_ordered__select__annual_products=annual) 

Các từng bước làm thế nào bạn có thể đạt được như nhau: -

# where 1 is the id of an one object in Catalog model. 
# You can pass Catalog object also to filter the users 
Order.objects.filter(select__id=1) 

# Here is the full query 
catalog = Catalog.objects.all()[0] 
orders = Order.objects.filter(select=catalog) 
users = [o.user for o in orders] # This loop isn't necessary. 

Bây giờ bạn có tất cả các đơn đặt hàng cụ thể cho một Catalog, từ đó bạn có thể lấy đối tượng người dùng bằng cách sử dụng thuộc tính user trong mỗi đơn đặt hàng.

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