如果将资源拉入另一个资源,则django tastypie资源查询集过滤器不起作用

时间:2018-01-10 12:16:54

标签: django django-queryset tastypie

模型

class Quote(models.model):
    quote_ref = models.TextField(null=True, blank=True)
    order = models.Foreignkey('Order', related_name='quotes')
    version models.DecimalField(null=True, blank=True)
    requested_date = models.DateField(null=True, blank=True)
    expiry_date = models.DateField(null=True, blank=True)
    closed_date = models.DateField(null=True, blank=True)

class Order(models.model):
    order_ref = models.CharField(null=True, blank=True)
    cost models.DecimalField(null=True, blank=True)
    order_date = models.DateField(null=True, blank=True)
    delivery_date = models.DateField(null=True, blank=True)
    .......
    .......

资源

class RequestsResource(ModelResource):
    quotes = fields.ToManyField('api.resources.QuoteIndexResource', 'quotes', full=True, null=True)
    class Meta:
        queryset = Order.objects.all()
        resource_name = 'request'


class QuoteIndexResource(ModelResource):

    class Meta:
        queryset = Quote.objects.all().filter(closed_date__isnull=True)
        resource_name = 'index_quote'

如果我自己使用QuoteIndexResourcequeryset上的过滤器可以正常工作,但如果它被拉入RequestsResource,那么过滤器对数据没有任何影响。

有没有办法让.filter(closed_date__isnull=True)在这种情况下工作?

2 个答案:

答案 0 :(得分:1)

似乎Tastypie中的ToManyField独立于元类中的查询集设置。

简单的解决方法是使用带lambda表达式的属性:

quotes = fields.ToManyField(
    'api.resources.QuoteIndexResource',
    attribute=lambda bundle: Quote.objects.all().filter(
        order=bundle.obj, closed_date__isnull=True),
    full=True, null=True
)

文档中的更多详细信息:http://django-tastypie.readthedocs.io/en/latest/fields.html#tomanyfield

答案 1 :(得分:1)

我的错,我应该在修复它时关闭这个问题。 所以我发现如果我使用attribute=lambda bundle我会收到错误。 但只使用lambda bundle:一切正常。

quotes = fields.ToManyField(
    'api.resources.QuoteIndexResource', lambda bundle: Quote.objects.filter(order=bundle.obj, closed_date__isnull=True),
    full=True, null=True