通常のdjangoで機能するこの関数を変更して、シリアライザーで機能させるにはどうすればよいですか?

Aug 22 2020

こんにちは、私はdjangoで使用するこのフィードバック作成関数を持っていますが、Iamは残りのAPIを実装しようとしているので、この関数を続行して変更する方法がわかりません。問題なくすべてのフィードバックを一覧表示できますが、create関数の実装方法がわかりません。助けていただければ幸いです。

これが私のモデルです。

class Action(models.Model):
    user = models.ForeignKey(settings.AUTH_USER_MODEL, related_name='actions', db_index=True,
                                                     on_delete=models.CASCADE)
    verb = models.CharField(max_length=255)
    target_ct = models.ForeignKey(ContentType, blank=True, null=True, related_name='target_obj',
                                                                on_delete=models.CASCADE)
    target_id = models.PositiveIntegerField(null=True, blank=True, db_index=True)
    target = GenericForeignKey('target_ct', 'target_id')
    created = models.DateTimeField(auto_now_add=True, db_index=True)

フィードバックを作成するには

def create_action(user, verb, target=None):
    now = timezone.now()
    last_minute = now - datetime.timedelta(seconds=30)
    similar_actions = Action.objects.filter(user_id=user.id, verb= verb, created__gte=last_minute)
    if target:
        target_ct = ContentType.objects.get_for_model(target)
        similar_actions = similar_actions.filter(target_ct=target_ct, target_id=target.id)
    if not similar_actions:
        action = Action(user=user, verb=verb, target=target)
        action.save()
        return True
    return False

シリアライザー

class GenericActionRelatedField(serializers.RelatedField):
    def to_representation(self, value):
        if isinstance(value, Post):
            serializer = PostListSerializer(value)
            return serializer.data
        if isinstance(value, Comment):
            serializer = CommentSerializer(value)
            return serializer.data

class ActionFeedSerializer(serializers.Serializer): #TODO
    user = UserSerializer(read_only=True)
    verb = serializers.CharField()
    target = GenericActionRelatedField(read_only=True)
    created = serializers.DateTimeField()

    class Meta:
        model = Action
        fields = ['user', 'verb', 'target_ct', 'target_id', 'target', 'created']

どうもありがとう!

回答

2 JPG Aug 22 2020 at 17:39

クラスのto_representation(...)メソッドをオーバーライドしActionFeedSerializer

class ActionFeedSerializer(serializers.Serializer):  # TODO
    user = UserSerializer(read_only=True)
    verb = serializers.CharField()
    target = GenericActionRelatedField(read_only=True)
    created = serializers.DateTimeField()

    class Meta:
        model = Action
        fields = ['user', 'verb', 'target_ct', 'target_id', 'target', 'created']

    def create(self, *arg, **kwargs): instance = super().create(*arg, **kwargs) create_action(instance.user, instance.verb, instance.target) return instance