Django Tastypie不止一次引用相同的ForeignKey模型

时间:2013-12-09 14:23:32

标签: django tastypie

有没有办法在Tastypie中多次引用相同的ForeignKey模型/资源?

假设模型:

class Case(models.Model):
    name = models.CharField(max_length=10)

class Interaction(models.Model):
    case = models.ForeignKey(Case, related_name="interaction_cases")
    type = models.CharField(max_length=2, choices=TYPE_CHOICES)

假设TastyPie资源:

class CaseResource(ModelResource):
    type_one_interactions = fields.ManyToManyField('TypeOneInteractionFullResource', 'interaction_cases', null=True, full_list=True, full=True)
    type_two_interactions = fields.ManyToManyField('TypeTwoInteractionFullResource', 'interaction_cases', null=True, full_list=True, full=True)

    class Meta:
        queryset = Case.objects.all()

class TypeOneInteractionResource(ModelResource):
    case = fields.ForeignKey(Case,'case')

    class Meta:
        queryset = Interaction.objects.all()

    def get_object_list(self, request):
        return super(TypeOneInteractionResource, self).get_object_list(request).filter(type='A')

class TypeTwoInteractionResource(ModelResource):
    case = fields.ForeignKey(Case,'case')

    class Meta:
        queryset = Interaction.objects.all()

    def get_object_list(self, request):
        return super(TypeTwoInteractionResource, self).get_object_list(request).filter(type='B')

基本上我正在尝试使用两个反向资源创建一个具有不同数据的同一模型的单个资源。当我访问CaseResource时,我在结果中看到TypeOneInteractionResource和TypeTwoInteractionResource,但数据没有被正确过滤。

我认为它与“related_name”相同,以及TastyPie在内部模拟连接的方式。有没有人成功这样做?它甚至可能吗?

1 个答案:

答案 0 :(得分:1)

原因是,在为相关资源get_object_list脱水时,根本没有调用ToManyField。(参见https://github.com/toastdriven/django-tastypie/blob/master/tastypie/fields.py#L780)。

相反,您需要使用dehydrate_type_one_interactions上的dehydrate_type_two_interactionsCaseResource方法。

另一方面,您可以在Case模型上提供将返回所需QuerySet的属性,并将这些属性用于ManyToManyFields中的属性名称。