Django基于不相关模型中的字段进行排序

后端开发 2026-07-10

我在我的Django项目中有两个模型。第一个是UserProfile,第二个是Interests:

class UserProfile(models.Model):
    user_model_for_profile = models.ForeignKey(CustomUser, on_delete=models.CASCADE)
    first_name = models.CharField(max_length = 25)
    middle_name = models.CharField(max_length = 25)
    last_name = models.CharField(max_length= 50)
    gender = models.CharField(choices = gender_choices, max_length = 30)
    profile_created_by = models.CharField(choices = profile_creation_choices, max_length = 30)
    date_of_birth = models.DateField()
    time_of_birth = models.TimeField()
    Height = models.IntegerField()
    #Day of birth needed?
    Country_of_birth = models.CharField(choices = Countries_choices, max_length = 30)
    State_of_birth = models.CharField(choices = State_choices, max_length = 40)
    City_of_birth = models.CharField(max_length = 30)
    Mobile_number = models.CharField(
        max_length=10,  # Adjust based on your needs
        validators=[RegexValidator(regex=r'^[6-9]\d{9}$')],
        unique = True
    )
    Password = models.CharField(max_length= 50)
    Religion = models.CharField(choices = Religion_choices, max_length = 30)
    Sub_community = models.CharField(choices = Sub_community_choices, max_length = 30)
    Nukh = models.CharField(max_length = 30)
    Verified = models.BooleanField(default = True)
class Interests(models.Model):
    interest_sent_by = models.ForeignKey(CustomUser, on_delete=models.CASCADE, related_name='relationship5')
    interested_in = models.ForeignKey(CustomUser, on_delete=models.CASCADE, related_name='relationship6')

我该如何基于Interests(特别是 if interested_in == request.user.id)对我的 UserProfile 对象进行排序?

我希望符合条件的个人资料排在最前面。

解决方案

from django.db.models import OuterRef, Exists

profiles = UserProfile.objects.annotate(
    has_interest=Exists(
        Interests.objects.filter(
            interest_sent_by=OuterRef('user_model_for_profile'),
            interested_in=request.user
        )
    )
).order_by('-has_interest')

OuterRef('user_model_for_profile') 是连接这两个模型的关键,它告诉Django将当前个人资料行中的用户与Interests表中的interest_sent_by进行匹配。

站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章