【问题标题】:Retrieve a filtered ForeignKey with Django使用 Django 检索过滤后的 ForeignKey
【发布时间】:2017-12-10 22:27:40
【问题描述】:

我有三个主要模型,Picture、Place 和 PlaceRating:

class Picture(models.Model):
    file = ImageField(max_length=500, upload_to="images")
    user = models.ForeignKey(User, null=True, related_name="userpictures")
    place = models.ForeignKey(Place, null=True, related_name='pictures')

class PlaceRating(models.Model):
    place = models.ForeignKey(Place, null=True, related_name="placeratings")
    user = models.ForeignKey(User, null=True, related_name="userratings")   
    rating = models.DecimalField(null=True, max_digits=4, decimal_places=1)     

class Place(models.Model):
    name = CharField(max_length=50)

我想显示用户给出的地点评级以及地点的图像,但我无法做到这一点,因为我需要过滤 ForeignKey 而 Django 似乎不允许这样做。

我想做的例子:

查看:

pictures = Picture.objects.filter(user=request.user)

模板:

{% for picture in pictures %}
    <img src="{{ picture.file.url }}" class="bigpicture">
    {{ picture.place.placeratings.0.rating|user:picture.user }}
{% endfor %}

关于信息,我设法使用模板标签来做到这一点,但这会对数据库产生很多我无法预取的不同查询..:

{% for picture in pictures %}
    <img src="{{ picture.file.url }}">
    {% getplaceratingrelatedtopic picture.place.id picture.user.id %}
{% endfor %}

还有:

@register.simple_tag
def getplaceratingrelatedtopic(placeid, userid):
    print(placeid)
    theplace = Place.objects.get(id=placeid)
    user = User.objects.get(id=userid)
    placerating = PlaceRating.objects.filter(author=user, place=place).last()
    if rating:
        return placerating.rating
    else:
        return ""

我使用 Python 2.7/Django 1.9。

有什么线索吗?非常感谢!

【问题讨论】:

    标签: python django tags django-queryset prefetch


    【解决方案1】:

    您应该将逻辑移至模型并在模板中使用它。

    class Picture(models.Model):
        file = ImageField(max_length=500, upload_to="images")
        user = models.ForeignKey(User, null=True, related_name="userpictures")
        place = models.ForeignKey(Place, null=True, related_name='pictures')
    
    
    class PlaceRating(models.Model):
        place = models.ForeignKey(Place, null=True, related_name="placeratings")
        user = models.ForeignKey(User, null=True, related_name="userratings")   
        rating = models.DecimalField(null=True, max_digits=4, decimal_places=1)     
    
    
    class Place(models.Model):
        name = CharField(max_length=50)
    
        @property
        def rating(self):
            return self.placeratings.get().rating
    
    {% for picture in picture_list %}
        <img src="{{ picture.file.url }}" class="bigpicture">
        {{ picture.place.rating }}: {{ picture.user.username }}
    {% endfor %}
    

    【讨论】:

    • 感谢您的解决方案。但这不会将评级过滤为仅用户发布的评级。我需要类似:@property def rating(self): return self.placeratings.filter(user=request.user)[0].rating .. Django 不接受。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-12-11
    • 1970-01-01
    • 2022-11-12
    • 2021-05-13
    • 1970-01-01
    • 1970-01-01
    • 2012-06-29
    相关资源
    最近更新 更多