【发布时间】:2019-03-02 11:19:42
【问题描述】:
我在两个模型(地点和标签)之间有多对多的关系。但是,tags 表中似乎存在不必要的重复。
例如,当使用现有标签创建新地点时,它会创建一个具有相同名称的重复标签并将其链接起来,而不是链接现有的标签。
我认为使模型上的名称字段唯一会有所帮助,但在运行发布请求时会导致以下错误,这是可以理解的:
{"tags":[{"name":["tags with this name already exists."]},{"name":["tags with th
is name already exists."]}]}
序列化器
class PlaceTagSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = Tags
fields = ('name',)
class PlaceSerializerPost(serializers.ModelSerializer):
tags = PlaceTagSerializer(many=True)
class Meta:
model = Place
fields = ('title', 'lat', 'lon', 'tags', 'featured_image_url', 'created_at')
def create(self, validated_data):
tags_data = validated_data['tags']
"""
Tags need to be deleted otherwise the place object will not save
as they need to be handled separately.
"""
del validated_data['tags']
place = Place.objects.create(**validated_data)
for tag_data in tags_data:
place.tags.get_or_create(place=place, **tag_data)
return place
型号
class Tags(models.Model):
name = models.CharField(max_length=200, unique=True)
def __str__(self):
return self.name
class Meta:
ordering = ('name',)
class Place(models.Model):
title = models.CharField(max_length=800)
lat = models.DecimalField(max_digits=20, decimal_places=10)
lon = models.DecimalField(max_digits=20, decimal_places=10)
featured_image_url = models.CharField(max_length=2000)
created_at = models.DateTimeField(auto_now_add=True)
tags = models.ManyToManyField(Tags)
live = models.BooleanField(default=1)
def __str__(self):
return self.title
class Meta:
ordering = ('title',)
【问题讨论】:
标签: python django django-rest-framework