tastypie - 相关资源返回null

2 投票
1 回答
529 浏览
提问于 2025-04-18 06:22

我有一个表格,里面有几个外键,我想获取一些嵌套的资源,但结果却是空的。也就是说,当我执行以下调用时:

http://localhost:8080/api/v1/testuns/?format=json

我得到的结果是:

{
meta: {
    limit: 20,
    next: null,
    offset: 0,
    previous: null,
    total_count: 1
},
objects: [
     {
       phone: {
           devices: null,
           modelnumber: null,
           phone_id: "2",
           resource_uri: "/api/v1/phone/2/"
       },
       resource_uri: "/api/v1/testuns/0/",
       result: "PASS",
       score: 90,
       test_run_id: "0"
     }
   ]
}

你可以看到,我的设备和型号并没有返回嵌套的资源。

我的api.py文件是这样的:

class DevicesResource(ModelResource):
    class Meta:
        queryset = Devices.objects.all()
        authorization = Authorization()
        resource_name = 'devices'

class ModelnumberResource(ModelResource):
    class Meta:
        queryset = Modelnumber.objects.all()
        authorization = Authorization()
        resource_name = 'modelnumber'

class PhoneResource(ModelResource):
    devices = fields.ForeignKey(DevicesResource, 'devices', full=True, null=True)
    modelnumber = fields.ForeignKey(ModelnumberResource, 'modelnumber', full=True, null=True)

    class Meta:
        queryset = Phone.objects.all()
        authorization = Authorization()
        resource_name = 'phone'

class TestunsResource(ModelResource):
    phone = fields.ForeignKey(PhoneResource, 'phone', full=True, null=True)
    class Meta:
        queryset = Testuns.objects.all()
        authorization = Authorization()
        resource_name = 'testuns'

而我的models.py文件是:

class Devices(models.Model):
    device_id = models.AutoField(primary_key=True)
    device_name = models.CharField(max_length=135, unique=True, blank=True)
    class Meta:
        db_table = u'devices'

class Modelnumber(models.Model):
    model_number_id = models.AutoField(primary_key=True)
    model_name = models.CharField(max_length=135, unique=True, blank=True)
    class Meta:
        db_table = u'modelnumber'

class Phone(models.Model):
    phone_id = models.AutoField(primary_key=True)
    model_number = models.ForeignKey(Modelnumber)
    device = models.ForeignKey(Devices)
    class Meta:
        db_table = u'phone'

class Testuns(models.Model):
    test_run_id = models.AutoField(primary_key=True)
    score = models.IntegerField()
    phone = models.ForeignKey(Phone)
    result = models.CharField(max_length=135)

为什么我的一些嵌套资源返回的是空值呢?

更新:添加了mysql查询:

mysql> select * from testuns;
+-------------+-------+----------+--------+
| test_run_id | score | phone_id | result |
+-------------+-------+----------+--------+
|           0 |    90 |        2 | PASS   |
+-------------+-------+----------+--------+
1 row in set (0.00 sec)

mysql> select * from phone;
+----------+-----------------+-----------+
| phone_id | model_number_id | device_id |
+----------+-----------------+-----------+
|        2 |               1 |         1 |
+----------+-----------------+-----------+
1 row in set (0.00 sec)

mysql>

1 个回答

0

不小心,你的评论让我注意到了这个解决方案:

class PhoneResource(ModelResource):
    device = fields.ForeignKey(DevicesResource, 'device', full=True, null=True)
    model_number = fields.ForeignKey(ModelnumberResource, 'model_number', full=True, null=True)

    class Meta:
        queryset = Phone.objects.all()
        authorization = Authorization()
        resource_name = 'phone'

你需要把资源字段的名字和模型中的名字完全一致。

我在自己的项目中测试过,当资源中的字段名和模型中的字段名不一样时,它会返回 null

这个问题让人困惑,因为有 null=Trueblank=True 的设置。这让它看起来能正常工作,但其实并不是你想要的那样。我在文档中找不到解释,但在文档字符串中发现了一些信息:

``attribute`` 参数应该指定哪个字段/可调用对象指向实例对象上的相关数据。是必需的。 文档字符串

编辑:

在这里 这行代码 中,你的字段不是外键,但它可以是空的,所以没有抛出任何异常。

撰写回答