我是Django领域的新手,但看到那里有很多"神奇".我正在使用Django REST Framework并创建允许免费用户注册的应用程序.我的用户需要一些Django用户不具备的其他字段.所以我用Google搜索扩展用户.有一种想法应该通过创建这样的东西来完成
class MyUser(models.Model):
user = models.ForeignKey(User, unique=True)
city = models.CharField(max_length=50, blank=True, default='')
Run Code Online (Sandbox Code Playgroud)
这很好,但我有这个序列化器
class UserSerializer(serializers.ModelSerializer):
class Meta:
model = MyUser
fields = ('id', 'username', 'password', 'first_name', 'last_name', 'email', 'city')
Run Code Online (Sandbox Code Playgroud)
所以,问题是这个序列化器在这里做了一些"魔术".它试图找出应该建模的字段...我想让用户在这里列出字段,这些字段在User中,'city'是新的自定义字段.Serializer没有得到应该在用户模型中查看.
我在这里错过了什么?如何告诉这个序列化器我想要用户内的一些字段?我也需要能够创建用户.
我有一个像这样的Django模型:
class WindowsMacAddress(models.Model):
address = models.TextField(unique=True)
mapping = models.ForeignKey('imaging.WindowsMapping', related_name='macAddresses')
Run Code Online (Sandbox Code Playgroud)
两个序列化程序,定义为:
class WindowsFlatMacAddressSerializer(serializers.Serializer):
address = serializers.Field()
class WindowsCompleteMappingSerializer(serializers.Serializer):
id = serializers.Field()
macAddresses = WindowsFlatMacAddressSerializer(many=True)
clientId = serializers.Field()
Run Code Online (Sandbox Code Playgroud)
通过视图访问序列化程序时,我得到以下输出:
[
{
"id": 1,
"macAddresses": [
{
"address": "aa:aa:aa:aa:aa:aa"
},
{
"address": "bb:bb:bb:bb:bb:bb"
}
],
"clientId": null
}
]
Run Code Online (Sandbox Code Playgroud)
几乎不错,除了我更喜欢:
[
{
"id": 1,
"macAddresses": [
"aa:aa:aa:aa:aa:aa",
"bb:bb:bb:bb:bb:bb"
],
"clientId": null
}
]
Run Code Online (Sandbox Code Playgroud)
我怎样才能做到这一点?
鉴于具有一对一关系的 Django 模型,如何设置 Django Rest 框架序列化程序和视图,以便 API 消费者以现金支付和支票支付的端点包括支付模型并允许所有 CRUD 功能?
楷模
class Payment(models.Model):
"""
Payment Log
"""
merchant = models.ForeignKey(Entity, on_delete=models.CASCADE, related_name="%(app_label)s_%(class)s_merchant")
customer = models.ForeignKey(Entity, on_delete=models.CASCADE, related_name="%(app_label)s_%(class)s_customer")
payment_method = models.ForeignKey(PaymentMethod, on_delete=models.CASCADE)
trx_amount = models.DecimalField(max_digits=10, decimal_places=3)
class PaymentCash(models.Model):
"""
Cash payments
"""
payment = models.OneToOneField(Payment, on_delete=models.CASCADE, primary_key=True)
date_paid = models.DateField()
# Other fields
class PaymentCheque(models.Model):
"""
Cheque deposits
"""
payment = models.OneToOneField(Payment, on_delete=models.CASCADE, primary_key=True)
cheque_number = models.CharField(max_length=50)
# Other fields
Run Code Online (Sandbox Code Playgroud)
示例视图
class PaymentCashViewSet(ListCreateRetrieveUpdateViewSet):
"""
Cash payment …Run Code Online (Sandbox Code Playgroud)