【发布时间】:2021-07-11 18:02:26
【问题描述】:
我想在使用序列化程序的 create 方法时自动生成模型的“路径”字段。否则,我希望能够在我的请求中传递此字段,以便稍后对其进行修改。 我还没有找到使模板的单个字段可选的方法。 这是我的模型:
models.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
这是我的代码:
serializer.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
views.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)
【问题讨论】:
-
这部分我没看懂:if len(Shop.objects.filter(path=path)) == 0:
-
@Neeraj 我检查是否已经有相同的路径,并根据它在后面添加一个字符串(因为链接必须是唯一的)
-
你不能保存路径吗?你在 serailizer 中做得正确你的代码有什么问题?
-
@Neeraj 是的,我的代码适用于 create 方法,但我想设置一个 PUT 方法,重用相同的序列化程序来更改路径
-
@Neeraj create 方法是唯一不需要在参数中传递路径的方法
标签: python django serialization django-rest-framework model