【问题标题】:django query to get posts from users followed by a userdjango 查询以获取用户的帖子,然后是用户
【发布时间】:2019-04-04 05:45:36
【问题描述】:

我的模型:

class ClientProfile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE, null=True, related_name='client_profile')
    follows = models.ManyToManyField(User, 
    related_name='follows',blank=True)
    profile_picture = models.ImageField( blank=True)
    phone_regex = RegexValidator(
        regex=r'^\+?1?\d{9,15}$',
        message="Phone number must be entered in the format: '+999999999'. Up to 15 digits allowed."
    )
    mobile_number = models.CharField(validators=[phone_regex], 
    max_length=17, blank=True)
    dob = models.DateField(auto_now = False, null = True)
    profile_summary = models.TextField()
    my_career_objective = models.TextField()
    educational_qualification = models.CharField(max_length=200)
    work_experience = models.IntegerField(blank=True, null=True)
    skill_set = models.TextField(blank=True)
    address_1 = models.CharField(max_length=300,blank=True)
    address_2 = models.CharField(max_length=300,blank=True)
    # new fileds
    about_me = models.TextField(blank=True)
    birthplace = models.CharField(max_length=150,blank=True)
    lives_in = models.CharField(max_length=150,blank=True)
    occupation = models.CharField(max_length=150, blank=True)
    gender = models.CharField(choices=GENDER_CHOICES,max_length=150, blank=True)
    marital_status = models.CharField(choices=MARITAL_CHOICES,max_length=150, blank=True,default=1)
    religion = models.CharField(max_length=150, blank=True)
    political_incline = models.TextField(blank=True)
    # other_social_networks = models.TextField(blank=True)
    hobbies = models.TextField(blank=True)
    favorite_tv_shows = models.TextField(blank=True)
    favorite_movies = models.TextField(blank=True)
    favorite_games = models.TextField(blank=True)
    favorite_music_band_artists = models.TextField("Favorite Music, Bands / Artists", blank=True)
    favorite_books = models.TextField(blank=True)
    favorite_writers = models.TextField(blank=True)
    other_interests = models.TextField(blank=True)
    subscription = models.TextField(blank=True, null=True, default="Free")


    def __str__(self):
        return str(self.user.first_name) + " " + str(self.user.last_name)




class Task(models.Model):
    level = models.ForeignKey(Level, on_delete=models.CASCADE)
    todo = models.ForeignKey(ToDo, on_delete=models.CASCADE)
    student = models.ForeignKey(User, on_delete=models.CASCADE)
    title = models.CharField(max_length=150)
    content = models.TextField()
    timestamp = models.TimeField(auto_now=True)
    datestamp = models.DateField( auto_now=True)
    like = models.ManyToManyField(User,related_name='user_likes',blank=True)
    is_verified=models.BooleanField(default=False,blank=True)

    def __str__(self):
        return self.title


   def get_absolute_url(self):
       return reverse('student:dashboard')
   objects = PostManager()

   @property
   def comments(self):
       instance = self
       qs = Comment.objects.filter_by_instance(instance)
       return qs

   @property
   def get_content_type(self):
       instance = self
       content_type = 
       ContentType.objects.get_for_model(instance.__class__)
       return content_type

我想显示登录用户的所有任务以及所有用户的所有任务,然后是登录用户。实现此功能的最佳 django 查询是什么? ClientProfile 模型中的以下字段被赋予了多对多字段来描述用户所关注的所有用户。如何使用 'or' 编写 django 查询。每个任务通过外键 'student' 指向用户。我想在主页显示登录用户的所有任务以及登录用户后跟的所有用户

【问题讨论】:

  • 您是否尝试过任何查询?结果如何?将它们与输出一起发布。
  • task = Task.objects.filter(Q(student=request.user) | Q(student__in=request.user.client_profile.follows)).order_by('timestamp').prefetch_related('images_set ')......这不起作用..错误:'ManyRelatedManager'对象不可迭代@Aravind

标签: python django django-queryset


【解决方案1】:

在任务的student 字段中放置一个related_name 属性。 (姑且称之为task) 如果logged_in_user 是您的登录用户对象,那么logged_in_user.task 将给出logged_in_user 的任务和用户的关注者任务:

tasks = Task.objects.filter(student__in= logged_in_user.follows.all())

没有related_name。

task = Task.objects.filter(Q(student=logged_in_user) | Q(student__in=logged_in_user.follows.all()))

【讨论】:

  • 我试过这个查询:client=ClientProfile.objects.get(user=request.user) task = Task.objects.filter(Q(student=request.user) | Q(student__in=client .follows.all()).order_by('timestamp').prefetch_related('images_set')
  • @MohitHarshan client.follows.all() 你错过了括号。
  • @MohitHarshan 如果有帮助,请将其标记为answered。它仍然显示在未答复的类别中。
【解决方案2】:

这对我有用:

 client=ClientProfile.objects.get(user=request.user)
 task = Task.objects.filter
  (Q(student=request.user) | 
   Q(student__in=client.follows.all()))
 .order_by('timestamp').prefetch_related('images_set')

【讨论】:

    猜你喜欢
    • 2011-08-06
    • 2015-11-08
    • 1970-01-01
    • 2014-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多