【问题标题】:How to query many-to-many fields in Django?如何在 Django 中查询多对多字段?
【发布时间】:2021-12-22 15:04:52
【问题描述】:

我正在尝试更新一个视图,该视图在给定当前登录用户的情况下返回我的宠物表中的所有项目。我在Pet 中有一个多对多字段petowners

PetOwner模型如下...

class PetOwner(models.Model):
    """Model representing a pet owner."""

    user = models.OneToOneField(User, on_delete=models.CASCADE)
    first_name = models.CharField(max_length=50, help_text="Enter owner's first name")
    last_name = models.CharField(max_length=50, help_text="Enter owner's last name")
    email = models.EmailField(
        max_length=50, blank=True, null=True, unique=True, help_text="Enter owner's email"
    )
    phone_number = models.CharField(
        max_length=15, blank=True, null=True, unique=True, help_text="Enter owner's phone number"
    )
    address = models.ForeignKey(
        "Address", on_delete=models.SET_NULL, null=True, blank=True
    )

Pet模型如下...

class Pet(models.Model):
    """Model representing a pet."""

    first_name = models.CharField(max_length=50, help_text="Enter pet's first name")
    last_name = models.CharField(max_length=50, help_text="Enter pet's last name")
    breeds = models.ManyToManyField("Breed", help_text="Select a breed for this pet")
    weight = models.DecimalField(
        max_digits=5, decimal_places=2, help_text="Enter pet's weight"
    )
    date_of_birth = models.DateField(null=True, blank=True)
    date_of_death = models.DateField("Died", null=True, blank=True)
    owners = models.ManyToManyField(PetOwner, help_text="Select an owner for this pet")
    address = models.ForeignKey(
        "Address", on_delete=models.SET_NULL, null=True, blank=True
    )

我正在使用 Django 已经提供给我们的User 进行身份验证(注册和登录)。 PetOwner 是在用户创建他们的帐户时创建的,以及他们的名字和姓氏。 PetOwner 仅具有 emailphone_numberaddress 作为唯一字段,但不是必需的。因此,唯一性的保证来自 Django 的User 模型中的username

我不想返回数据库中的所有宠物,而是只返回当前登录用户的宠物。类似于以下内容...

Pet.objects.filter(owners.contain(request.user))

也许通过使用用户名?我不知道怎么写这个查询。

【问题讨论】:

    标签: django model django-queryset


    【解决方案1】:

    首先设置related_nameowners字段:

    class Pet(models.Model):
        """Model representing a pet."""
    
        first_name = models.CharField(max_length=50, help_text="Enter pet's first name")
        last_name = models.CharField(max_length=50, help_text="Enter pet's last name")
        breeds = models.ManyToManyField("Breed", help_text="Select a breed for this pet")
        weight = models.DecimalField(
            max_digits=5, decimal_places=2, help_text="Enter pet's weight"
        )
        date_of_birth = models.DateField(null=True, blank=True)
        date_of_death = models.DateField("Died", null=True, blank=True)
        owners = models.ManyToManyField(PetOwner, help_text="Select an owner for this pet", related_name='pets')  # <- Here
        address = models.ForeignKey(
            "Address", on_delete=models.SET_NULL, null=True, blank=True
        )
    

    然后你可以通过这个查询来获取用户的宠物:

    target_user = User.objects.get(id=1)  # This is only an example
    pet_owner = PetOwner.objects.get(user=target_user)
    pets = pet_owner.pets.all()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-25
      • 2013-05-17
      • 2011-04-07
      相关资源
      最近更新 更多