如何从多对多字段中获取所有数据?

2024-10-03 23:19:32 发布

您现在位置:Python中文网/ 问答频道 /正文

我想在这里做的是显示当前用户“Signels”从所有用户,他是跟踪。但无法获取多个用户的数据

型号.py

class Signels(models.Model):
     author = models.ForeignKey(User, on_delete=models.CASCADE, null=True)
     coin_name = models.CharField(max_length=300 , null=True, blank=True)
     symbol = models.CharField(max_length=10 , null=True, blank=True)
     title = models.CharField(max_length = 100, null=True, blank=True)
     buy =  models.CharField(max_length=200 , null=True, blank=True)
     sell =  models.CharField(max_length=200 , null=True, blank=True)

class Follow(models.Model):
     user = models.ForeignKey(User, related_name='current_user', null=True)
     Following = models.ManyToManyField(User)

视图.py

    def post(request):
        user1 = request.user
        user_now = Follow.objects.get(user=user1)
        for followed in user_now.Following.all():
            signel = Signels.objects.filter(author=followed)
            return render(request, 'posts/all.html', { "signels" : signel } ) 

全部.html

        {% for i in signels %}

        <div class="card post_card ">

       <a type="button" href="/profile/{{i.author.username}}" 
     class="username"><b>{{i.author.username}}</b></a>
       <p class="category">{{i.title}} </p>
      <p class="category"><b>{{i.coin_name}}({{i.symbol}})</b></p>
        <b class="buy">buy</b>:{{ i.buy }} ,  &nbsp;
         <b class="sell">sell</b>: {{i.sell}},  &nbsp;


        {% endfor %}

我在“all.html”中得到的结果是,它显示了第一个用户在多对多字段中跟踪的所有信号。但他跟踪的其他用户却一无所获。我想让当前用户看到他跟踪的所有用户的所有标志


Tags: 用户truemodelsbuynulllengthmaxclass
1条回答
网友
1楼 · 发布于 2024-10-03 23:19:32

您可以获得给定用户后跟的Signelsauthor的所有Signels

Signels.objects.filter(author__follow__user=request.user)

所以在视图中,我们可以这样写:

def post(request):
    signels = Signels.objects.filter(author__follow__user=request.user)
    return render(request, 'posts/all.html', { "signels" : signels } )

但我不确定你现在的造型是否合适。最好将两个用户链接到Follow模型,从而让Follow充当两个用户之间的“直通”模型。现在Follow对象基本上是User模型上的一个额外的“代理”,从而创建一个额外的表。在建模过程中,一个User可能有两个(或更多)Follow对象,每个对象都包含一组following。这还将导致额外的JOIN,从而使查询更难计算

更有效的“跟随”系统可能是:

from django.contrib.auth import get_user_model

class Follow(models.Model):
    follower = models.ForeignKey(
        get_user_model(),
        related_name='current_user',
        on_delete=models.CASCADE,
        related_name='followees'
    )
    followee = models.ForeignKey(
        get_user_model(),
        related_name='current_user',
        on_delete=models.CASCADE,
        related_name='followers'
    )

    class Meta:
        unique_together=('followers', 'followee')

在这种情况下,查询是:

Signels.objects.filter(author__followers__follower=request.user)

在这里,一个用户不能跟随同一个用户两次,我们防止通过多对多关系创建一个额外的“隐藏”表

或者您可以create a custom user model [Django-doc]在这里添加一个多对多关系,以便进行后续操作

相关问题 更多 >