【发布时间】:2022-02-09 01:48:07
【问题描述】:
我正在尝试发布一个组合对象,它指的是已经存在的标签对象。基本上我希望组合的 tag_id 字段包含 2 个引用 Tag 对象的 id。
这是我的代码:
models.py
class Combination(models.Model):
user = models.ForeignKey(CustomUser, on_delete=models.SET_NULL, null=True)
gameround = models.ForeignKey(Gameround, on_delete=models.CASCADE, null=True)
resource = models.ForeignKey(Resource, on_delete=models.CASCADE, null=True)
tag_id = models.ManyToManyField(Tag, null=True)
created = models.DateTimeField(editable=False)
score = models.PositiveIntegerField(default=0)
objects = models.Manager()
def __str__(self):
return str(self.tag_id) or ''
serializers.py
class CombinationSerializer(serializers.ModelSerializer):
tag_id = TagWithIdSerializer(many=True, required=False)
resource_id = serializers.PrimaryKeyRelatedField(queryset=Resource.objects.all(),
required=True,
source='resource',
write_only=False)
gameround_id = serializers.PrimaryKeyRelatedField(queryset=Gameround.objects.all(),
required=False,
source='gameround',
write_only=False)
user_id = serializers.PrimaryKeyRelatedField(queryset=CustomUser.objects.all(),
required=False,
source='user',
write_only=False)
class Meta:
model = Combination
depth = 1
fields = ('id', 'user_id', 'gameround_id', 'resource_id', 'tag_id', 'created', 'score')
def create(self, validated_data):
user = None
request = self.context.get("request")
if request and hasattr(request, "user"):
user = request.user
score = 0
tag_data = validated_data.pop('tag_id')
combination = Combination(
user=user,
gameround=validated_data.get("gameround"),
resource=validated_data.get("resource"),
created=datetime.now(),
score=score
)
for tag_object in tag_data:
combination.set(tag_id=tag_object)
if len(combination.tag_id) == 2:
return combination
def to_representation(self, instance):
rep = super().to_representation(instance)
rep['tag_id'] = TagWithIdSerializer(instance.tag_id.all(), many=True).data
return rep
有了这个我目前得到一个 AttributeError :'Combination'对象没有属性'set'
如果我更新这个:
for tag_object in tag_data:
combination.set(tag_id=tag_object)
像这样:
combination.save()
for tag_object in tag_data:
combination.tag_id.add(tag_object)
我现在收到错误字段 'id' expected a number but got OrderedDict([('name', 'word'), ('language', 'en')])。
如果我添加:
combination.save()
for tag_object in tag_data[0]:
combination.tag_id.add(tag_object)
我得到 ValueError 字段 'id' 需要一个数字,但得到了 'name'。
我怎样才能摆脱这个?
【问题讨论】:
标签: django django-models django-rest-framework