小编Mat*_*nik的帖子

Django Rest Framework序列化程序中的循环依赖

我正在使用Django Rest Framework 3编写的Web API中的序列化器中的循环依赖性进行斗争.虽然我知道项目中的循环依赖几乎总是设计糟糕的标志,但我找不到一个好的方法来避免它使应用程序成为一个巨大的整体噩梦.

一个简单的剥离示例很好地描绘了在所有地方发生的事情,我遇到了类似的问题.

让我们在两个应用程序中有两个简单的模型:

个人资料应用

# profiles/models.py

from images.models import Image

class Profile(models.Model):
    name = models.CharField(max_length=140)  

    def recent_images(self):
        return Image.objects.recent_images_for_user(self)
Run Code Online (Sandbox Code Playgroud)

图像应用程序

# images/models.py

class Image(models.Model):
    profile = models.ForeignKey('profiles.Profile')
    title = models.CharField(max_length=140)
Run Code Online (Sandbox Code Playgroud)

遵循胖模型的原则,我经常在模型中使用多个导入,以便使用Profile上的方法轻松检索相关对象,但这很少会导致循环依赖,因为我很少从另一端做同样的事情.

当我尝试向串口添加序列化器时,问题就开始了.为了缩小API占用空间并将必要的调用量限制到最小,我想在其两端以一种简化形式序列化一些相关对象.

我希望能够在/profile端点上检索配置文件,这些配置文件将简化用户嵌套创建的最近几张图像的信息.此外,当从/images端点检索图像时,我希望在图像JSON中嵌入配置文件信息.

为了实现这一点并避免递归嵌套,我有两个序列化器 - 一个嵌套相关对象,一个不嵌套,对于这两个应用程序.

个人资料应用

# profiles/serializers.py

from images.serializers import SimplifiedImageSerializer

class SimplifiedProfileSerializer(serializers.Serializer):
    name = serializers.CharField()

class ProfileSerializer(SimplifiedProfileSerializer):
    recent_images = SimplifiedImageSerializer(many=True)
Run Code Online (Sandbox Code Playgroud)

图像应用程序

# images/serializers.py

from profiles.serializers import SimplifiedProfileSerializer

class SimplifiedImageSerializer(serializers.Serializer):
    title = serializers.CharField()

class ImageSerializer(SimplifiedImageSerializer):
    profile …
Run Code Online (Sandbox Code Playgroud)

django serialization circular-dependency python-import django-rest-framework

25
推荐指数
2
解决办法
5693
查看次数

$ GLOBALS ["argv"]和$ argv为空,$ _SERVER ["argv"]就好了

我正在与在Hostgator共享主机上运行的PHP CLI的(可能)简单问题作斗争.一个简单的代码:

<?php
var_dump($argv);
var_dump($GLOBALS["argv"]);
var_dump($_SERVER["argv"]);
var_dump(ini_get("register_argv_argv"));
?>
Run Code Online (Sandbox Code Playgroud)

在我的本地计算机以及php的其他几个实例上运行时:

php test.php arg1
Run Code Online (Sandbox Code Playgroud)

按预期正确输出:

array (
  0 => 'test.php',
  1 => 'arg1'
)
array (
  0 => 'test.php',
  1 => 'arg1'
)
array (
  0 => 'test.php',
  1 => 'arg1'
)
1
Run Code Online (Sandbox Code Playgroud)

但是从Host上的cron运行共享托管它的输出:

array (
)
NULL
array (
  0 => 'test.php',
  1 => 'arg1'
)
1
Run Code Online (Sandbox Code Playgroud)

我正在与之战斗的代码是遗留代码,并且在很大程度上依赖于$ GLOBALS ["argv"]来解析命令行参数.我无法修改整个代码库来依赖$ _SERVER ["argv"].

可能是为什么我的所有PHP实例都使用命令行参数填充所有数组,而且Hostgator上的托管php根本没有填充$ GLOBALS ["argv"]?

我做了一个解决这个问题的解决方法,但是当我不知道为什么会发生什么时我讨厌:)

谢谢你的任何想法!

php

4
推荐指数
1
解决办法
3096
查看次数