У меня есть две модели: одна для создания названия и одна для создания голосования за это название.Модель Django дублируется от модели foreignkey
Когда я создаю более одного голоса по одному и тому же заголовку, я получаю дубликаты названий, и я не могу понять, почему.
Вот моя модель голос,
class Vote(GenericModel):
"""
Model for vote on a title
"""
title = models.ForeignKey(Title, blank=True, related_name='votes')
user = models.ForeignKey(ArtLover, blank=True)
def __str__(self):
return _("vote on {}").format(self.title.__str__())
и вид на голосование:
@detail_route(methods=['post'])
def vote(self, request, *args, **kwargs):
"""
Create vote for a title
"""
title = Title.objects.get(text=kwargs.get('text'))
user = ArtLover.objects.get(id=request.user.id)
if title.user.id == user.id:
return Response(
_("You can't vote for your own title"),
status=status.HTTP_403_FORBIDDEN
)
if Vote.objects.filter(title=title, user=user).exists():
return Response(
_("Vote already exists"),
status=status.HTTP_409_CONFLICT
)
vote = Vote.objects.create(title=title, user=user)
return Response({
'vote': VoteSerializer(vote).data
}, status=status.HTTP_201_CREATED)
Если я печатаю количество экземпляров заголовка после создания голосования, подсчет не хорошо, не дублировать , поэтому я предполагаю, что дублирование произойдет позже. Можете ли вы указать мне, где/почему происходит дублирование?
Когда я удаляю голосование, название, созданное дублированием, также удаляется.
Edit 1:
Я попытался создать собственный менеджер для моделей титульных блокировать дублирование, но когда дублирование произойдет при создании голосования, менеджер названия не называются.
Когда я сравниваю первичный ключ экземпляра исходных моделей с дублированием, они одинаковы.
Edit 2:
пытается упорядочить поля названия в художественных произведений сериализатором
мои работы сериализатору:
class ArtworkDetailSerializer(serializers.ModelSerializer):
"""
Detailed serializer for Artwork
"""
artist = serializers.CharField(source='artist.username', read_only=True)
titles = TitleSerializer(many=True)
emotions = serializers.SerializerMethodField()
class Meta:
model = Artwork
fields = ('id', 'file', 'artist', 'index', 'url', 'titles', 'emotions')
read_only_fields = ('id', 'artist', 'index', 'url', 'titles', 'emotions')
мой титул сериализатору:
class TitleSerializer(serializers.ModelSerializer):
"""
Serializer for title suggested by user
"""
votes = VoteSerializer(many=True, read_only=True)
user = serializers.CharField(source='user.username', read_only=True)
artwork = serializers.CharField(source='artwork.url', read_only=True)
class Meta:
model = Title
fields = ('id', 'artwork', 'text', 'user', 'votes',)
read_only_fields = ('id', 'artwork', 'user', 'votes',)
мои работы Вид:
class ArtworkView(viewsets.ModelViewSet):
"""
View that handle Artwork
"""
lookup_field = 'url'
queryset = Artwork.objects.all()
permission_classes = (
permissions.IsAuthenticatedOrReadOnly,
IsArtistOrReadOnly,
)
def get_serializer_class(self):
if self.action == 'retrieve':
return ArtworkDetailSerializer
return ArtworkSerializer
Нет названия не создаются вообще в коде у вас есть показано на рисунке. Как вы думаете, почему здесь создается дубликат? – Alasdair
Поскольку название дублируется, когда я создаю голосование, и в моем тесте это код, который я выполняю, поэтому я предполагаю, что django делает дублирование самостоятельно – bboumend
Пожалуйста, покажите свой тестовый код. Я не вижу, как код выше будет создавать какие-либо заголовки, если у вас нет сигналов или переопределенных методов, которые вы нам не показывали. – Alasdair