如何在Django的视图中比较用户登录的字段与其他用户

时间:2017-08-18 08:40:21

标签: python django

假设我有以下模型:

import ephem

class Person(models.Model):
        username = models.ForeignKey(User, blank=False)
        slug = models.SlugField(blank=False)
        location = ForeignKey(Location, blank=True) # return longitude & latitude city from Pyephem library
        city = models.CharField(max_length=255, blank=False, default='')

        def __str__(self):
            return self.username

        def get_city(self):
           city = ephem.Observer()
           city.lon = float(self.location.longitude)
           city.lat = float(self.location.latitude)
           return city # return city from location field

        def save(self, *args, **kwargs):
            if not self.pk:
                self.slug = slugify(self.username)
            super(Person, self).save(*args, **kwargs)

如何在django的视图中以编程方式进行比较 在已登录用户的属性和属性的其他用户 之间?其中的用户名字段基于slug&还有来自其他python库(Pyephem)的其他对象,如下所示:

def detail(request, slug):
    instance = Person.objects.all()
    city = ........ # City from city fields at Person model, the city's value from current user logged have their value as city0 and city's values for other user have value as city1, city2, city3 Et seq...

    for distance in instance:            
        # if current user logged are visiting other user detail then compare them each other
        do something for city0 and city1, city0 and city2, city0 and city3 Et seq....
            distance = ... # calculate distance of city's user logged & city's other user
        # I'm not sure what to do in this area so it will get the results of comparing between attribute of current user logged and attribute of other user

        return render(
        request, "detail.html",
        {
            'distance': distance,
        }
    )

*更新

我根据@cezar答案更新了上面的模型并添加了city的功能:

3 个答案:

答案 0 :(得分:2)

根据我的理解,很可能很多用户在你的模型中有一个slug。因此,如果您想在已记录的用户和一组用户之间进行比较,我会生成QuerySet然后迭代。

def detail(request, slug=None):
    instances = Person.objects.filter(slug=slug)

    if instances.count() == 0:
        return HttpResponse('Slug returns 0 matches')
    else:
        for object in instances:
            do something for city0 and city1

好的,感谢您提供更多详情!现在发布更新后,我认为request.user对象就是您要找的对象:

def calculate_distance(user1, user2):
    #do something here like:
    #user1.location.lat user2.location.long etc.
    return distance_between

def detail(request, slug=None):
    instance = Person.objects.get(slug=slug)
    observer_user = request.user

    #added below variable to clarify code
    user_to_be_observed = instance

    return calculate_distance(observer_user, user_to_be_observed)

答案 1 :(得分:1)

user1 = Person.objects.get(pk=1) 您的意思是user Person字段吗? 我认为它应该是user1 = Person.objects.get(pk=1).user

此外,
这里

city1 = Person.objects.filter(city__name='value1')

,其中filter方法始终返回QuerySet, 见:https://docs.djangoproject.com/en/1.11/ref/models/querysets/

答案 2 :(得分:1)

据我所知,您想要计算两个不同用户的城市之间的距离 - 一个登录并访问该页面(让我们称他为访客),另一个人的页面已被访问过(让我们看看)叫他主持人。)

你有模特:

models.py

from django.db import models
from django.utils.text import slugify
from django.contrib.auth import User

class Person(models.Model):
    username = models.ForeignKey(User)
    slug = models.SlugField()
    city = models.ForeignKey(City)

def __str__(self):
    return self.username

# you can generate the slug automatically when a new Person
# is added for first time, it won't change the slug later
def save(self, *args, **kwargs):
    if not self.pk:
        self.slug = slugify(self.username)
    super(Person, self).save(*args, **kwargs)

现在让我们为Person创建通用视图。

views.py

from django.views import generic

from .models import Person

class PersonList(generic.ListView):
    model = Person

class PersonDetail(generic.DetailView):
    model = Person

    def get_context_data(self, **kwargs):
        """
        This method add extra values like the distance
        between the Visitor's city and the Host's city.
        """
        context = super(PersonDetail, self).get_context_data(**kwargs)
        visitor = self.request.user
        distance = # pseudocode: visitor.city - self.object.city
        context.update({'distance': distance})
        return context

在您的模板中,您可以访问distance并可以将其显示给访问者,这样她就可以知道她的城市与主办城市的距离。 我对图书馆Pyephem没有任何经验,所以你必须用适当的计算来替换伪代码行。