Python 如何创建其名称在创建另一个对象时作为参数传递的相关对象
我想在保存一个与之相关的对象之前创建一个对象,我该怎么做 在我的项目模型中,我有标记ManyToManyField。我想创建或更新将标记名作为参数传递的项,即使尚未创建具有此名称的标记对象 型号.pyPython 如何创建其名称在创建另一个对象时作为参数传递的相关对象,python,django,django-rest-framework,Python,Django,Django Rest Framework,我想在保存一个与之相关的对象之前创建一个对象,我该怎么做 在我的项目模型中,我有标记ManyToManyField。我想创建或更新将标记名作为参数传递的项,即使尚未创建具有此名称的标记对象 型号.py class Tag(models.Model): name = models.CharField(primary_key=True, max_length=50, unique=True, db_index=True) items_num = models.BigIntegerFi
class Tag(models.Model):
name = models.CharField(primary_key=True, max_length=50, unique=True, db_index=True)
items_num = models.BigIntegerField('Number of Items', default=0)
class Item(models.Model):
category = models.ForeignKey('Category', on_delete=models.DO_NOTHING)
tags = models.ManyToManyField('Tag')
user = models.ForeignKey('users.User', on_delete=models.CASCADE)
name = models.CharField(max_length=30)
description = models.CharField(max_length=300, blank=True)
main_image = models.ImageField(default='main_image_test_path')
CHEAP = 'CH'
MIDDLE = 'MI'
EXPENSIVE = 'EX'
VERY_EXPENSIVE = 'VE'
MOST_EXPENSIVE = 'ME'
PRICE_CHOICES = [
(CHEAP, 'Cheap'),
(MIDDLE, 'Middle'),
(EXPENSIVE, 'Expensive'),
(VERY_EXPENSIVE, 'Very Expensive'),
(MOST_EXPENSIVE, 'Most Expensive')
]
price = models.CharField(
max_length=2,
choices=PRICE_CHOICES,
default=CHEAP
)
status = models.BooleanField(default=1) # 1 - Active, 0 - Inactive
class ItemListSerializer(serializers.ModelSerializer):
tags = serializers.PrimaryKeyRelatedField(many=True, queryset=Tag.objects.all())
category = serializers.SlugRelatedField(slug_field='name',
queryset=Category.objects.all(),)
user = UserSerializer(read_only=True,)
class Meta:
model = Item
fields = ('id', 'name', 'category', 'tags', 'user', 'price', 'status',)
def validate_tags(self, value):
print(value)
if len(list(set(value))) != len(value):
raise serializers.ValidationError('All tags must be unique')
return value
def create(self, validated_data):
validated_data['user'] = self.context['request'].user
for tag in validated_data['tags']:
tag.items_num += 1
tag.save()
validated_data['category'].items_num += 1
validated_data['category'].save()
item = super(ItemListSerializer, self).create(validated_data)
return item
class TagSerializer(serializers.ModelSerializer):
class Meta:
model = Tag
fields = ('name', 'items_num',)
class ItemList(mixins.ListModelMixin,
mixins.CreateModelMixin,
generics.GenericAPIView):
queryset = Item.objects.all()
permission_classes = [permissions.IsAuthenticated]
serializer_class = ItemListSerializer
def get(self, request, *args, **kwargs):
return self.list(request, *args, **kwargs)
def post(self, request, *args, **kwargs):
return self.create(request, *args, **kwargs)
class ItemList(mixins.ListModelMixin,
mixins.CreateModelMixin,
generics.GenericAPIView):
queryset = Item.objects.all()
permission_classes = [permissions.IsAuthenticated]
serializer_class = ItemListSerializer
def get(self, request, *args, **kwargs):
return self.list(request, *args, **kwargs)
def post(self, request, *args, **kwargs):
return self.create(request, *args, **kwargs)
序列化程序.py
class Tag(models.Model):
name = models.CharField(primary_key=True, max_length=50, unique=True, db_index=True)
items_num = models.BigIntegerField('Number of Items', default=0)
class Item(models.Model):
category = models.ForeignKey('Category', on_delete=models.DO_NOTHING)
tags = models.ManyToManyField('Tag')
user = models.ForeignKey('users.User', on_delete=models.CASCADE)
name = models.CharField(max_length=30)
description = models.CharField(max_length=300, blank=True)
main_image = models.ImageField(default='main_image_test_path')
CHEAP = 'CH'
MIDDLE = 'MI'
EXPENSIVE = 'EX'
VERY_EXPENSIVE = 'VE'
MOST_EXPENSIVE = 'ME'
PRICE_CHOICES = [
(CHEAP, 'Cheap'),
(MIDDLE, 'Middle'),
(EXPENSIVE, 'Expensive'),
(VERY_EXPENSIVE, 'Very Expensive'),
(MOST_EXPENSIVE, 'Most Expensive')
]
price = models.CharField(
max_length=2,
choices=PRICE_CHOICES,
default=CHEAP
)
status = models.BooleanField(default=1) # 1 - Active, 0 - Inactive
class ItemListSerializer(serializers.ModelSerializer):
tags = serializers.PrimaryKeyRelatedField(many=True, queryset=Tag.objects.all())
category = serializers.SlugRelatedField(slug_field='name',
queryset=Category.objects.all(),)
user = UserSerializer(read_only=True,)
class Meta:
model = Item
fields = ('id', 'name', 'category', 'tags', 'user', 'price', 'status',)
def validate_tags(self, value):
print(value)
if len(list(set(value))) != len(value):
raise serializers.ValidationError('All tags must be unique')
return value
def create(self, validated_data):
validated_data['user'] = self.context['request'].user
for tag in validated_data['tags']:
tag.items_num += 1
tag.save()
validated_data['category'].items_num += 1
validated_data['category'].save()
item = super(ItemListSerializer, self).create(validated_data)
return item
class TagSerializer(serializers.ModelSerializer):
class Meta:
model = Tag
fields = ('name', 'items_num',)
class ItemList(mixins.ListModelMixin,
mixins.CreateModelMixin,
generics.GenericAPIView):
queryset = Item.objects.all()
permission_classes = [permissions.IsAuthenticated]
serializer_class = ItemListSerializer
def get(self, request, *args, **kwargs):
return self.list(request, *args, **kwargs)
def post(self, request, *args, **kwargs):
return self.create(request, *args, **kwargs)
class ItemList(mixins.ListModelMixin,
mixins.CreateModelMixin,
generics.GenericAPIView):
queryset = Item.objects.all()
permission_classes = [permissions.IsAuthenticated]
serializer_class = ItemListSerializer
def get(self, request, *args, **kwargs):
return self.list(request, *args, **kwargs)
def post(self, request, *args, **kwargs):
return self.create(request, *args, **kwargs)
视图.py
class Tag(models.Model):
name = models.CharField(primary_key=True, max_length=50, unique=True, db_index=True)
items_num = models.BigIntegerField('Number of Items', default=0)
class Item(models.Model):
category = models.ForeignKey('Category', on_delete=models.DO_NOTHING)
tags = models.ManyToManyField('Tag')
user = models.ForeignKey('users.User', on_delete=models.CASCADE)
name = models.CharField(max_length=30)
description = models.CharField(max_length=300, blank=True)
main_image = models.ImageField(default='main_image_test_path')
CHEAP = 'CH'
MIDDLE = 'MI'
EXPENSIVE = 'EX'
VERY_EXPENSIVE = 'VE'
MOST_EXPENSIVE = 'ME'
PRICE_CHOICES = [
(CHEAP, 'Cheap'),
(MIDDLE, 'Middle'),
(EXPENSIVE, 'Expensive'),
(VERY_EXPENSIVE, 'Very Expensive'),
(MOST_EXPENSIVE, 'Most Expensive')
]
price = models.CharField(
max_length=2,
choices=PRICE_CHOICES,
default=CHEAP
)
status = models.BooleanField(default=1) # 1 - Active, 0 - Inactive
class ItemListSerializer(serializers.ModelSerializer):
tags = serializers.PrimaryKeyRelatedField(many=True, queryset=Tag.objects.all())
category = serializers.SlugRelatedField(slug_field='name',
queryset=Category.objects.all(),)
user = UserSerializer(read_only=True,)
class Meta:
model = Item
fields = ('id', 'name', 'category', 'tags', 'user', 'price', 'status',)
def validate_tags(self, value):
print(value)
if len(list(set(value))) != len(value):
raise serializers.ValidationError('All tags must be unique')
return value
def create(self, validated_data):
validated_data['user'] = self.context['request'].user
for tag in validated_data['tags']:
tag.items_num += 1
tag.save()
validated_data['category'].items_num += 1
validated_data['category'].save()
item = super(ItemListSerializer, self).create(validated_data)
return item
class TagSerializer(serializers.ModelSerializer):
class Meta:
model = Tag
fields = ('name', 'items_num',)
class ItemList(mixins.ListModelMixin,
mixins.CreateModelMixin,
generics.GenericAPIView):
queryset = Item.objects.all()
permission_classes = [permissions.IsAuthenticated]
serializer_class = ItemListSerializer
def get(self, request, *args, **kwargs):
return self.list(request, *args, **kwargs)
def post(self, request, *args, **kwargs):
return self.create(request, *args, **kwargs)
class ItemList(mixins.ListModelMixin,
mixins.CreateModelMixin,
generics.GenericAPIView):
queryset = Item.objects.all()
permission_classes = [permissions.IsAuthenticated]
serializer_class = ItemListSerializer
def get(self, request, *args, **kwargs):
return self.list(request, *args, **kwargs)
def post(self, request, *args, **kwargs):
return self.create(request, *args, **kwargs)
当我发出post请求时,会出现以下错误:
“标签”:[
无效pk“不存在标记名称”-对象不存在
]