python - Django - 带有序列化程序的可选字段
问题描述
当我使用序列化程序的 create 方法时,我想自动生成模型的“路径”字段。否则,我希望能够在我的请求中传递此字段,以便稍后对其进行修改。我还没有找到使模板的单个字段可选的方法。这是我的模型:
模型.py
class Shop(models.Model):
name = models.CharField(max_length=255)
category = models.ForeignKey(ShopCategory, on_delete=models.SET_NULL, null=True, blank=True)
description = models.TextField(blank=True, null=True)
path = models.CharField(max_length=255, unique=True)
mustBeLogged = models.BooleanField(default=False)
deliveries = models.FloatField(default=7)
def __str__(self):
return self.name
这是我的代码:
序列化程序.py
class ShopSerializer(serializers.ModelSerializer):
class Meta:
model = Shop
exclude = ['path']
def create(self, validated_data):
path = validated_data["name"].replace(" ", "-").lower()
path = unidecode.unidecode(path)
unique = False
while unique == False:
if len(Shop.objects.filter(path=path)) == 0:
unique = True
else:
# Generate a random string
char = "abcdefghijklmnopqrstuvwxyz"
path += "-{}".format("".join(random.sample(char, 5)))
shop = Shop.objects.create(**validated_data, path=path)
shop.save()
return shop
视图.py
def post(self, request):
"""For admin to create shop"""
serializer = ShopSerializer(data=request.data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data)
return Response(serializer.errors)
解决方案
您可以将路径设置为 Null 并在 create 方法中弹出它。这样您就不必将其添加到exclude
.
class ShopSerializer(serializers.ModelSerializer):
path = serializers.CharField(allow_blank=True, allow_null=True)
class Meta:
model = Shop
fields = '__all__'
def create(self, validated_data):
validated_data.pop('path')
path = validated_data["name"].replace(" ", "-").lower()
path = unidecode.unidecode(path)
unique = False
while unique == False:
if len(Shop.objects.filter(path=path)) == 0:
unique = True
else:
# Generate a random string
char = "abcdefghijklmnopqrstuvwxyz"
path += "-{}".format("".join(random.sample(char, 5)))
shop = Shop.objects.create(**validated_data, path=path)
shop.save()
return shop
def update(self, instance, validated_data):
#You will have path in validated_data
#And you may have to check if the values are null
return super(ShopSerializer, self).update(instance, validated_data)
除此之外,在您的代码中:
while unique == False:
if len(Shop.objects.filter(path=path)) == 0:
这将是非常昂贵的操作。在每个循环中它都会触发一个查询,我不确定它背后的逻辑,但您可能想要更改它。
推荐阅读
- javascript - 使用 javascript jquery 3.5.1 获取所有表格元素的值,包括 td、textarea 或 innerHtml 值
- c - _flushall() 在清除缓冲区时不起作用
- powershell - 从此 sha-1 文件中获取 sha-256
- r - 计算 Tukey 中位数
- sql - 如何使用sql server中的group子句从每个组中获取最新记录
- python - UnboundLocalError:创建构造函数后在成员函数中赋值之前引用的局部变量“温度”?
- c++ - 计算线的终点不起作用
- python - Np 值错误:使用序列设置数组元素
- c# - 从 Python 进程获取实时输出时缺少异常
- python - parquet-tools 无法读取 zstd 文件但可以读取 gzip?