Как сделать запрос к полю "многие ко многим" в Django

Я пытаюсь обновить представление, которое возвращает все мои предметы из таблицы домашних животных, учитывая текущего зарегистрированного пользователя. У меня есть в 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
    )

Я использую User, который уже предоставлен нам Django для аутентификации (регистрация и вход). PetOwner создается, когда пользователь создает свой аккаунт, вместе с его именем и фамилией. В PetOwner есть только email, phone_number и address как уникальные поля, но не обязательные. Поэтому гарантия уникальности исходит от username из User модели Django.

Я не хочу возвращать всех питомцев в моей базе данных, вместо этого я хочу возвращать только питомцев для текущего пользователя, который вошел в систему. Что-то вроде следующего...

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

Может быть, с помощью имени пользователя? Я не знаю, как написать этот запрос.

Сначала установите related_name поле owners:

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()
Вернуться на верх