django 如何关联其中一个字段相等的两个表?

gopyfrb3  于 2023-01-06  发布在  Go
关注(0)|答案(1)|浏览(191)

我是django和django rest框架的新手。请原谅我的英语不好...我试图把两个django模型联系起来:

  • 第一个(ModulMess类)从远程编号模块接收消息
  • 模块A收到消息"AAA"-模块B收到消息"BBB"-模块A收到消息"CCC"-模块C收到消息"DDD"
  • 第二个类(类Owner)是拥有模块的用户列表
  • 用户XX拥有模块A和模块C-用户YY拥有模块B
    我正在尝试使搜索过滤器,以便为实际用户列出这类消息:
For example, for UserXX:

         UserXX received from moduleA messages "AAA" and "CCC"
                         and from moduleC message "DDD"

请你解释我理论上如何管理它?我不能想象如何使两个模型之间的关系,因为他们有一个平等的领域每一个...
非常感谢!
我试过:

class Owner(models.Model):
        user = models.ForeignKey(User, on_delete=models.CASCADE,related_name='usermod')
        modulkey = models.CharField(max_length=255)
        date_in = models.DateTimeField(default=timezone.now, blank=True)

        def __str__(self):
        return f'{self.user.first_name} {self.user.last_name} | {self.modulkey}'

    class ModulMess(models.Model):
        modulkey = models.ForeignKey(Owner, on_delete=models.CASCADE)
        date_ini = models.DateTimeField(default=timezone.now, blank=True)
        message = models.CharField(max_length=255)

但无法达到实现一个好的串行化器,也不能查看...

vs91vp4v

vs91vp4v1#

我认为你的模型是正确的。你还需要正确的查询集逻辑,你已经准备好了。但是我会尽量提供视图集和序列化器。
虽然ModuleMess模型中的FK modulkey可以更改为owner,因为这样更有意义:

class ModulMess(models.Model):
    owner = models.ForeignKey(Owner, on_delete=models.CASCADE)
    date_ini = models.DateTimeField(default=timezone.now, blank=True)
    message = models.CharField(max_length=255)

查询逻辑可以在不同的函数中定义,如下所示:

def get_messages_for_user(user):
    # Get the owner object for the user
    owner = Owner.objects.get(user=user)

    # Filter the ModulMess queryset to include only messages for the user's modulkey
    messages = ModulMess.objects.filter(owner__modulkey=owner.modulkey)

    return messages

然后对于序列化器,我们可以使用模型序列化器类。如下所示:

class ModulMessSerializer(serializers.ModelSerializer):
    class Meta:
        model = ModulMess
        fields = ['id', 'date_ini', 'message', 'owner']

最后,视图集如下所示:

class ModulMessViewSet(viewsets.ViewSet):
    permission_classes = [IsAuthenticated]
    serializer_class = ModulMessSerializer

    def list(self, request):
        user = request.user
        messages = get_messages_for_user(user)
        serializer = self.serializer_class(messages, many=True)
        return Response(serializer.data)

相关问题