Наследование прав доступа между родственными моделями в DRF

>>> import re
>>> text = '1011101111'
>>> len(re.findall('(?=11)', text))
5

Если вы не хотите загружать весь список совпадений в память, это никогда не будет проблемой! вы можете сделать это, если хотите:

>>> sum(1 for _ in re.finditer('(?=11)', text))
5

Как функция (re.escape, убедитесь, что подстрока не мешает регулярному выражению):

>>> def occurrences(text, sub):
        return len(re.findall('(?={0})'.format(re.escape(sub)), text))

>>> occurrences(text, '11')
5
0
задан Nabat Farsi 5 March 2019 в 05:24
поделиться

1 ответ

Хорошо, надеюсь, было бы более простое решение, но вот как я решил это. Я попытался здесь не создавать владельца для модели изображения, потому что модель изображения имеет PropertyPost в качестве родителя, у которого есть владелец. Таким образом, Image должен наследовать этого владельца:

class Image(models.Model):

    prop_post = models.ForeignKey(
        PropertyPost,
        related_name='images4thisproperty',
        on_delete=models.CASCADE)
    prop_post_owner=models.CharField(max_length=150,null=True,blank=True)

, и это будет сериализатор:

class ImageSerializer(serializers.HyperlinkedModelSerializer):
    prop_post = serializers.SlugRelatedField(queryset=PropertyPost.objects.all(),
                                             slug_field='pk')
    prop_post_owner = serializers.ReadOnlyField(source='prop_post.owner.username')
    class Meta:
        model = Image
        fields = (
            'pk',
            'url',
            'prop_post',
            'prop_post_owner'
       )

таким образом, моя модель изображения имеет владельца, который приходит из PropertyPost.

Теперь на уровне списка пользователь может создать объект, и так как неясно, какой объект пользователь выберет, пользовательские действия не будут выполнены. Наконец, вот как я запрещаю не владельцам создавать поле изображения для свойства:

class ImageList(generics.ListCreateAPIView):
    queryset = Image.objects.all()
    serializer_class = ImageSerializer
    name = 'image-list'
    ....
    def perform_create(self, serializer):
        obj=PropertyPost.objects.get(pk=int(self.request.data['prop_post']))
        if self.request.user!=obj.owner:
            raise ValidationError('you are not the owner')
        serializer.save(prop_post_owner=self.request.user)
0
ответ дан Nabat Farsi 5 March 2019 в 05:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: