Фильтрация объектов в отношении ManyToMany по нескольким критериям - PullRequest
1 голос
/ 26 февраля 2020

Я хочу получить экземпляр модели моего объекта 'Collection', где 'request.user' находится либо в отношениях 'owner', либо 'contributors', а id этого объекта - 'collection_id'. Вот мой код:

models.py

    class Collection(models.Model):
        title = models.CharField(max_length=250, unique=True)
        owner = models.ForeignKey(User, related_name='owner', on_delete=models.DO_NOTHING)
        contributors = models.ManyToManyField(User, related_name='contributors', blank=True)

views.py

    def collection_edit(request, collection_id)
        ...
        # Here I want to check if request.user is in contributors or owner
        collection = Collection.objects.filter(owner_id=request.user, pk=collection_id).first()
        # Do stuff
        ...

Также есть 'on_delete = models.DO_NOTHING' в отношениях с владельцем, которые прервутся целостность моей базы данных, если пользователь удален?

1 Ответ

2 голосов
/ 26 февраля 2020

Вы можете фильтровать с Q объектами:

from django.db.models import <b>Q</b>

Collection.objects.filter(<b>Q(owner=request.user) | Q(contributors=request.user)</b>)

Здесь мы, таким образом, получаем Collection объектов, для которых owner равно request.user, или request.user является одним из авторов. Если он является и владельцем, и участником, он также будет частью коллекции.

Кроме того, on_delete=models.DO_NOTHING в отношениях с владельцем нарушит целостность моей базы данных, если пользователь будет удален?

Да, поскольку это означает, что поле user_id в этот момент будет содержать значение первичного ключа пользователя, которого больше не существует. Однако большинство баз данных не позволяют это и поднимают IntegrityError. Может быть лучше использовать PROTECT, если вы не хотите, чтобы Django удалил User, если есть еще Collection с user в качестве owner.

...