繁体   English   中英

Django 如何过滤所有对象的外键字段

[英]Django How to filter all objects foreign key field

表:event_rewards

表:奖励

序列化器:EventRewardSerializer

序列化器:奖励序列化器

模型.py

class Reward(models.Model):
    id = models.BigAutoField(primary_key=True)
    category = models.IntegerField(blank=True, null=True)
    count = models.IntegerField(blank=True, null=True)
    image = models.CharField(max_length=255, blank=True, null=True)
    name = models.CharField(max_length=255)
    price = models.IntegerField(blank=True, null=True)

    class Meta:
        db_table = 'reward'

 class EventRewards(models.Model):
    event = models.ForeignKey(Event, models.DO_NOTHING)
    rewards = models.OneToOneField('Reward', related_name='event_id', on_delete=models.CASCADE)

    class Meta:
        db_table = 'event_rewards'

序列化程序.py

class EventRewardSerializer(serializers.ModelSerializer):
    class Meta:
        model = EventRewards
        fields = ['event', 'rewards']


class RewardSerializer(serializers.ModelSerializer):
    event_id = serializers.SlugRelatedField(
        read_only=True,
        slug_field='event_id'
     )

    class Meta:
        model = Reward
        fields = ['id', 'category', 'count', 'image', 'name', 'price', 'event_id']

视图.py

class JoinRewardView(APIView):
    def get(self, request, pk_event, pk_post, pk_user, formant=None):
        reward_list = Reward.objects.all().filter(event_id=pk_event)
        print(reward_list)
        reward_list_serializer = RewardSerializer(data=reward_list, many=True)
        reward_list_serializer.is_valid()
        print(reward_list_serializer.data)
        return Response(reward_list_serializer.data, status=status.HTTP_400_BAD_REQUEST)

邮递员 -> all().filter(event_id=1)

[ { "id": 1, "category": 1, "count": 100, "image": "img3", "name": "coke", "price": 1000, "event_id": 1 } ]

邮递员 -> 全部()

[ { "id": 1, "category": 1, "count": 100, "image": "img3", "name": "coke", "price": 1000, "event_id": 1 }, { "id": 2, "category": 1, "count": 10, "image": "img4", "name": "coffee", "price": 2500, "event_id": 1 } ]

all() -> 2 个数据 -> 好的!

all().filter(category=1) -> 2 个数据 -> 好的!

all().filter(event_id=1) -> 1 个数据 -> 为什么???

更改 ModelSerializer 并使用 Table__Column

序列化程序.py

class EventRewardSerializer(serializers.ModelSerializer):
    class Meta:
        model = EventRewards
        fields = ['event', 'rewards']


class RewardSerializer(serializers.ModelSerializer):
    event_reward = EventRewardSerializer()

    class Meta:
        model = Reward
        fields = ['id', 'category', 'count', 'image', 'name', 'price', 'event_reward']

视图.py

 def get(self, request, pk_event, pk_post, pk_user, formant=None):
        reward_list = Reward.objects.all().filter(event_reward__event=1)
        print(reward_list)
        reward_list_serializer = RewardSerializer(data=reward_list, many=True)
        reward_list_serializer.is_valid()
        return Response(reward_list_serializer.data, status=status.HTTP_400_BAD_REQUEST)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM