Seguí la sugerencia de esta pregunta Pero necesito nombrar un campo de query_set hasta la fecha archivado de otro objeto
mis modelos son
class Choice(models.Model): question = models.ForeignKey(Question, related_name='choice', on_delete=models.CASCADE) choice_text = models.CharField(max_length=200) votes = models.IntegerField(default=0) def __str__(self): return self.choice_text class ChoiceWithTime(models.Model): choiceTime = models.ForeignKey(Choice,related_name='choiceTime', on_delete=models.CASCADE) choice_date=models.DateField()Mi vista
class QuestionChoicesViewSet(viewsets.ModelViewSet): queryset = Choice.objects.all() serializer_class = ChoiceDateSerializer def get_queryset(self): return Choice.objects.values('choiceTime__choice_date','choice_text').annotate( total_votes=Count('choiceTime__choice_date'), )Necesito contar el número de envíos en fechas particulares
No sé cómo nombrar choiceTime__choice_date que el serializador reconoce el campo en el conjunto de consultas
class ChoiceDateSerializer(serializers.ModelSerializer): choiceTime__choice_date = serializers.DateTimeField() total_votes = serializers.IntegerField() class Meta: model = Choice fields = ('id', 'choice_text','total_votes','choiceTime__choice_date')Recibo
{ "choice_text": "ant tower", "total_votes": 3, "choiceTime__choice_date": "2017-04-20" }pero quiero recibir
{ "choice_text": "ant tower", "total_votes": 3, "choice_date": "2017-04-20" }Intenté diferentes opciones sin éxito. Definitivamente me estoy perdiendo el punto. Para mis propósitos, funciona, pero quiero tener una API bien escrita.
¿2 opción cambiar el modelo de envío de tiempo?
class ChoiceWithTime(models.Model): choiceTime = models.ForeignKey(Choice,related_name='choiceTime', on_delete=models.CASCADE) choice_date=models.DateField() coutner = models.IntegerField(default=0)¿Se considera que la opción 2 es un mejor enfoque para mi problema particular? ¡Gracias!
Está recibiendo un objeto json, al que agrega su valor clave.
for vote_detail in data: if vote_detail.choiceTime__choice_date: vote_detail.choice_date=vote_detail.choiceTime__choice_dateluego serialice y guarde, una solución rápida.
También puede agregar a su modelo el nombre que desea llamarlo. Eso está más cerca del backend y tal vez valga la pena profundizar en él.
from django.db.models import Count,FSi alguien encuentra este problema y esta es la respuesta más fácil que se me ocurrió. Como se sugirió antes de pasar al valor de cambio del serializador usando las funciones del paquete modelo
class QuestionChoicesViewSet(viewsets.ModelViewSet): queryset = Choice.objects.all() serializer_class = ChoiceDateSerializer def get_queryset(self): return Choice.objects.all().annotate(choice_date=F('choiceTime__choice_date')).values('choice_date','choice_text').annotate( total_votes=Count('choiceTime__choice_date'), )