我有一种情况,其中序列化器字段的值取决于当前登录用户的身份.我已经看到了在初始化序列化程序时如何将用户添加到上下文中,但是我不确定在使用ViewSet时如何执行此操作,因为您只提供序列化程序类而不是实际的序列化程序实例.
基本上我想知道如何去:
class myModelViewSet(ModelViewSet):
queryset = myModel.objects.all()
permission_classes = [DjangoModelPermissions]
serializer_class = myModelSerializer
Run Code Online (Sandbox Code Playgroud)
至:
class myModelSerializer(serializers.ModelSerializer):
uploaded_by = serializers.SerializerMethodField()
special_field = serializers.SerializerMethodField()
class Meta:
model = myModel
def get_special_field(self, obj):
if self.context['request'].user.has_perm('something.add_something'):
return something
Run Code Online (Sandbox Code Playgroud)
很抱歉,如果它是不明确的,从文档: 添加额外的Context 它说做
serializer = AccountSerializer(account, context={'request': request})
serializer.data
Run Code Online (Sandbox Code Playgroud)
但我不知道如何从视图集自动执行此操作,因为我只能更改序列化程序类,而不是序列化程序实例本身.
我有一个序列化程序,根据其他字段的值验证字段,在错误响应中,我想将每个字段错误显示为字段错误,而不是显示"non_field_errors"下的所有内容,如果我要提高的话会发生什么对象级验证方法中的ValidationError.下面是我想要实现的目标的说明:
MySerializer(ModelSerializer):
...
def validate(self, data):
field_val1 = data['field_val1']
field_val2 = data['field_val2']
if not self._is_field_valid(field_val1, field_val2):
# The below line is how I would do what I want with Django
# Forms, however, it's not valid in DRF
self._errors['field_val1'] = 'this field is not valid'
Run Code Online (Sandbox Code Playgroud)
所需的错误响应是:
{'field_val1': ['this field is not valid']}
Run Code Online (Sandbox Code Playgroud) 我在我的Zend项目中使用Doctrine 2 ORM,并且需要在几种情况下将我的实体序列化为JSON.
ATM我使用Querybuilder并加入我需要的所有表.但是我的序列化程序导致学说延迟加载每个相关的实体,导致相当大的数据量并引发递归.
现在我正在寻找一种完全禁用Doctrines延迟加载行为的方法.
我选择数据的方法如下:
$qb= $this->_em->createQueryBuilder()
->from("\Project\Entity\Personappointment", 'pa')
->select('pa', 't', 'c', 'a', 'aps', 'apt', 'p')
->leftjoin('pa.table', 't')
->leftjoin('pa.company', 'c')
->leftjoin('pa.appointment', 'a')
->leftjoin('a.appointmentstatus', 'aps')
->leftjoin('a.appointmenttype', 'apt')
->leftjoin('a.person','p')
Run Code Online (Sandbox Code Playgroud)
我希望我的结果集只包含选定的表和关联.
任何帮助将不胜感激.
我一直在使用数据库LINQ中的XML,并发现使用序列化器非常困难.
数据库LINQ需要一个存储的字段XElement.
我有一个复杂的对象有很多自定义的结构类,所以我想使用XmlSerializer来序列化对象.
但是,序列化程序只能序列化为文件("C:\ xxx\xxx.xml")或内存流.
但是要将它转换或序列化为XElement,以便我可以使用LINQ存储在数据库中?
以及如何做到相反?即反序列化XElement ...
我的项目中有这两个实体
class PoliceGroupe
{
/**
* @var int
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @var string
*
* @ORM\Column(name="code", type="string", length=50)
*/
private $code;
/**
* @ORM\ManyToMany(targetEntity="PointVente", inversedBy="policegroupe")
* @ORM\JoinTable(name="police_groupe_point_vente",
* joinColumns={@ORM\JoinColumn(name="police_groupe_id", referencedColumnName="id")},
* inverseJoinColumns={@ORM\JoinColumn(name="point_vente_id", referencedColumnName="id")}
* )
*/
private $pointVente;
/**
* Constructor
*/
public function __construct($produit)
{
$this->pointVente = new \Doctrine\Common\Collections\ArrayCollection();
}
}
Run Code Online (Sandbox Code Playgroud)
这是我的另一个实体
class PointVente
{
/**
* @var string
*
* @ORM\Column(name="abb", type="string", length=50)
*/
private $abb;
/**
* …Run Code Online (Sandbox Code Playgroud) 我想知道在使用Moshi时如何忽略Kotlin类字段.
我找到了这个Java(Moshi忽略字段)的答案,它表明使用关键字transient如下
private transient String your_variable_name;
Run Code Online (Sandbox Code Playgroud)
但我找不到在Kotlin完成这项工作的正确方法.
System.Xml.Serialization.XmlSerial的consturctor需要我要序列化的类的类型.
instance = New AnyClass()
Dim xmlszer As New XmlSerializer(instance.GetType)
Run Code Online (Sandbox Code Playgroud)
没问题.但是如何在不启动的情况下获得AnyClass的类型?
我正在寻找一个可以获取实例的序列化程序,并将其序列化为一个包含c#代码的字符串,表示图形的内容.该类的功能类似于SerializeObjectJSON.NET.
我知道只有一组非常狭窄的结构可以使用,但我感兴趣的结构非常简单,他们会这样做.
如果有人知道具有类似功能的Visual Studio Visualizer,则可获得奖励积分.
编辑: 输出将在编译时在不同的应用程序中使用.我不需要在运行时反序列化输出(c#代码),它会保存到文件中进行分析.
var foo = new Foo() { Number = 1, Bar = new Bar() { Str = "Bar"}};
string sourceCode = Magic.SerializeObject(foo);
Run Code Online (Sandbox Code Playgroud)
输出:
Foo obj = new Foo();
obj.Number = 1;
obj.RefType = null; // infer this
obj.Bar = new Bar();
obj.Bar.Str = "Bar";
Run Code Online (Sandbox Code Playgroud) 我正在阅读Django REST Framework,我有一个使用SerializerMethodField()与getter序列化的模型.
但是,当我POST到此端点时,我希望能够设置此字段,但这不起作用,因为正如上面的文档所示,您无法写入SerializerMethodField.Django REST中是否有任何方法可以为您定义自定义getter方法的序列化器字段,以及自定义setter方法?
编辑:这是我正在尝试做的事情的来源.客户与用户具有一对一的关系.
class ClientSerializer(serializers.ModelSerializer):
email = serializers.SerializerMethodField()
def create(self, validated_data):
email = validated_data.get("email", None) # This doesn't work because email isn't passed into validated_data because it's a readonly field
# create the client and associated user here
def get_email(self, obj):
return obj.user.email
class Meta:
model = Client
fields = (
"id",
"email",
)
Run Code Online (Sandbox Code Playgroud) 在这里,我正在为REST API构建Symfony SDK.大多数数据都是具有嵌套的其他JSON对象的JSON对象.像这儿
{
"id": "eng_pl",
"name": "Premier League",
"_links": {
"self": {
"href": "/tournaments/eng_pl"
},
"seasons": {
"href": "/tournaments/eng_pl/seasons/"
}
},
"coverage": {
"id": "eng",
"name": "England",
"_links": {
"self": {
"href": "/territories/eng"
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
反序列化必须生成一个与下面列出的代码生成的对象相等的对象:
$tournament = new Tournament();
$tournament->setId('eng_pl');
$tournament->setName('Premier League');
$coverage = new Territory();
$coverage->setId('eng');
$coverage->setName('England');
$tournament->setCoverage($coverage);
Run Code Online (Sandbox Code Playgroud)
我正在使用我自己的自定义Denormalizers,在Tournament对象的denormalizer代码片段下面:
class TournamentDenormalizer implements DenormalizerInterface
{
/**
* @inheritdoc
*/
public function supportsDenormalization($object, $type, $format = null)
{
if ($type != Tournament::class) {
return false;
} …Run Code Online (Sandbox Code Playgroud)