【问题标题】:Check if a record from one model exists in a list with records from another model in Django检查一个模型的记录是否存在于 Django 中另一个模型的记录列表中
【发布时间】:2018-02-24 20:30:55
【问题描述】:

我在 Django 中定义了两个简单的模型...一个包含专辑名称,另一个包含专辑和用户的链接。

class Album(models.Model):
    name = models.CharField(max_length=255)

class UserAlbum
    category = models.ForeignKey(Album, on_delete=models.CASCADE)
    author = models.ForeignKey(
        settings.AUTH_USER_MODEL,
        on_delete=models.CASCADE,
    )

在我看来,我得到了所有专辑的列表,并检查了用户拥有哪些专辑:

albums = Album.objects.order_by('name')
my_albums = UserAlbum.objects.filter(user_id=request.user.id)

这一切都很好。但是,我现在需要在线显示包含专辑的列表,如果用户拥有专辑,应该会出现一个小图标。我不知道该怎么做。这就是我所拥有的:

<ul>
{% for info in albums %}
<li>{{ info.name %} {% if SOME_CONDITION %} <span class="owner"></span>{% endif %}</li>
{% endif %}

我不确定如何制定 SOME_CONDITION。它基本上应该说:如果这张专辑 id 也在 my_albums 列表中。但是我该怎么做呢?

【问题讨论】:

  • my_album 列表中的对象属于模型 UserAlbum,专辑列表中的对象属于模型 Album。他们的 id 永远不会匹配:/

标签: python django


【解决方案1】:

您实际上并不需要 UserAlbum 模型,除非您想将额外的字段附加到 m2m 关系。相反,只需使用 ManyToManyField。

from django.contrib.auth import get_user_model
User = get_user_model()

class Album(models.Model):
    name = models.CharField(max_length=255)
    users = models.ManyToManyField(User)

然后您可以在模板中测试Album().users.all() 的成员资格。

{% for album in albums %}
<li>{{ album.name }}
  {% if request.user in album.users.all %}
    <span class="owner"></span>
  {% endif %}
</li>
{% endfor %}

如果您对 UserAlbum 模型有一些计划,you can use it as a intermediate model.

class Album(models.Model):
    name = models.CharField(max_length=255)
    users = models.ManyToManyField(User, through='UserAlbum')

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2015-03-27
  • 1970-01-01
  • 2019-05-25
  • 2021-06-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-30
相关资源
最近更新 更多