Re: Subquery has too many columns

2017-02-25 Thread eltonplima
For me it's realy a bug.

I need to report them?

On Tuesday, February 21, 2017 at 11:55:16 PM UTC-3, eltonplima wrote:
>
> I tried many things, only work if I remove the annotate or 
> remove base_manager_name. But I need both!
>
> The save method is not the problem, I removed.
>
> If the last code I posted work, then, my production code works.
>
> PS: Sorry if my English is not very good, I'm trying to improve it.
>
> On Tuesday, February 21, 2017 at 10:16:04 PM UTC-3, Melvyn Sopacua wrote:
>>
>> While the testcase is simple, it is not the simplest test :)
>>
>>  
>>
>> Two things come to mind:
>>
>>1. If you get rid of the Sum(), does it work then? 
>>2. Saving the model with the base_manager_name should not use that 
>>manager as related manager. It is only used when a model with a foreign 
>> key 
>>to ProdutoServico is saved.
>>
>> In your original exception, it looks like ProdutoServico extends a model 
>> in sumario.models and both override the save method:
>>
>>  
>>
>> /home/eltonplima/ssd/repository/planonegocios/marketing/models.py in save
>>
>>super().save(*args, **kwargs) ...
>>
>> ▶ Local vars
>>
>> /home/eltonplima/ssd/repository/planonegocios/sumario/models.py in save
>>
>>super().save(*args, **kwargs) ...
>>
>>  
>>
>> Is it possible your problem is in one of those two?
>>
>>  
>>
>> On Tuesday 21 February 2017 16:37:12 eltonplima wrote:
>>
>> > This is part of my real code but demonstrate the issue in pratice:
>>
>> > 
>>
>> > from django.db import models
>>
>> > 
>>
>> > class ProdutoServicoManager(models.Manager):
>>
>> > def get_queryset(self):
>>
>> > custo_unitario = models.F('custounitario__valor')
>>
>> > quantidade = models.F('custounitario__quantidade')
>>
>> > expression = models.Sum(custo_unitario * quantidade)
>>
>> > custo_producao_expr = models.ExpressionWrapper(expression,
>>
>> > 
>>
>> > output_field=models.DecimalField())
>>
>> > return
>>
>> > super().get_queryset().annotate(custo_producao=custo_producao_expr)
>>
>> > 
>>
>> > 
>>
>> > class ProdutoServico(models.Model):
>>
>> > produto = models.BooleanField(default=True)
>>
>> > descricao = models.TextField()
>>
>> > objects = ProdutoServicoManager()
>>
>> > 
>>
>> > class Meta:
>>
>> > #
>>
>> > # Comment the line below and the test pass.
>>
>> > #
>>
>> > base_manager_name = 'objects'
>>
>> > 
>>
>> > 
>>
>> > class CustoUnitario(models.Model):
>>
>> > produto_servico = models.ForeignKey(ProdutoServico)
>>
>> > item = models.CharField(max_length=128)
>>
>> > quantidade = models.PositiveIntegerField()
>>
>> > valor = models.DecimalField(max_digits=10,
>>
>> > decimal_places=4,
>>
>> > verbose_name='Valor unitário')
>>
>> > 
>>
>> > 
>>
>> > class Faturamento(models.Model):
>>
>> > produto_servico = models.OneToOneField(ProdutoServico)
>>
>> > quantidade = models.PositiveIntegerField()
>>
>> > preco_unitario = models.DecimalField(max_digits=10,
>>
>> > decimal_places=2)
>>
>> > 
>>
>> > # We need only a single simple test to demonstrate this issue.
>>
>> > 
>>
>> > from django.test import TestCase
>>
>> > from django.db import utils
>>
>> > 
>>
>> > from model_mommy import mommy
>>
>> > 
>>
>> > from core import models
>>
>> > 
>>
>> > class FaturamentoTest(TestCase):
>>
>> > 
>>
>> > def test(self):
>>
>> > faturamento = mommy.make(models.Faturamento)
>>
>> > produto = faturamento.produto_servico
>>
>> > try:
>>
>> > produto.save()
>>
>> > except utils.OperationalError:
>>
>> > self.fail("Whats wrong?")
>>
>> > 
>>
>> > On Tuesday, February 21, 2017 at 9:01:50 AM UTC-3, Melvyn Sopacua wrote:
>>
>> > > On Monday 20 February 2017 17:09:40 elton

Re: Subquery has too many columns

2017-02-21 Thread eltonplima
I tried many things, only work if I remove the annotate or 
remove base_manager_name. But I need both!

The save method is not the problem, I removed.

If the last code I posted work, then, my production code works.

PS: Sorry if my English is not very good, I'm trying to improve it.

On Tuesday, February 21, 2017 at 10:16:04 PM UTC-3, Melvyn Sopacua wrote:
>
> While the testcase is simple, it is not the simplest test :)
>
>  
>
> Two things come to mind:
>
>1. If you get rid of the Sum(), does it work then? 
>2. Saving the model with the base_manager_name should not use that 
>manager as related manager. It is only used when a model with a foreign 
> key 
>to ProdutoServico is saved.
>
> In your original exception, it looks like ProdutoServico extends a model 
> in sumario.models and both override the save method:
>
>  
>
> /home/eltonplima/ssd/repository/planonegocios/marketing/models.py in save
>
>    super().save(*args, **kwargs) ...
>
> ▶ Local vars
>
> /home/eltonplima/ssd/repository/planonegocios/sumario/models.py in save
>
>super().save(*args, **kwargs) ...
>
>  
>
> Is it possible your problem is in one of those two?
>
>  
>
> On Tuesday 21 February 2017 16:37:12 eltonplima wrote:
>
> > This is part of my real code but demonstrate the issue in pratice:
>
> > 
>
> > from django.db import models
>
> > 
>
> > class ProdutoServicoManager(models.Manager):
>
> > def get_queryset(self):
>
> > custo_unitario = models.F('custounitario__valor')
>
> > quantidade = models.F('custounitario__quantidade')
>
> > expression = models.Sum(custo_unitario * quantidade)
>
> > custo_producao_expr = models.ExpressionWrapper(expression,
>
> > 
>
> > output_field=models.DecimalField())
>
> > return
>
> > super().get_queryset().annotate(custo_producao=custo_producao_expr)
>
> > 
>
> > 
>
> > class ProdutoServico(models.Model):
>
> > produto = models.BooleanField(default=True)
>
> > descricao = models.TextField()
>
> > objects = ProdutoServicoManager()
>
> > 
>
> > class Meta:
>
> > #
>
> > # Comment the line below and the test pass.
>
> > #
>
> > base_manager_name = 'objects'
>
> > 
>
> > 
>
> > class CustoUnitario(models.Model):
>
> > produto_servico = models.ForeignKey(ProdutoServico)
>
> > item = models.CharField(max_length=128)
>
> > quantidade = models.PositiveIntegerField()
>
> > valor = models.DecimalField(max_digits=10,
>
> > decimal_places=4,
>
> > verbose_name='Valor unitário')
>
> > 
>
> > 
>
> > class Faturamento(models.Model):
>
> > produto_servico = models.OneToOneField(ProdutoServico)
>
> > quantidade = models.PositiveIntegerField()
>
> > preco_unitario = models.DecimalField(max_digits=10,
>
> > decimal_places=2)
>
> > 
>
> > # We need only a single simple test to demonstrate this issue.
>
> > 
>
> > from django.test import TestCase
>
> > from django.db import utils
>
> > 
>
> > from model_mommy import mommy
>
> > 
>
> > from core import models
>
> > 
>
> > class FaturamentoTest(TestCase):
>
> > 
>
> > def test(self):
>
> > faturamento = mommy.make(models.Faturamento)
>
> > produto = faturamento.produto_servico
>
> > try:
>
> > produto.save()
>
> > except utils.OperationalError:
>
> > self.fail("Whats wrong?")
>
> > 
>
> > On Tuesday, February 21, 2017 at 9:01:50 AM UTC-3, Melvyn Sopacua wrote:
>
> > > On Monday 20 February 2017 17:09:40 eltonplima wrote:
>
> > > > Base class is abstract.
>
> > > > 
>
> > > > 
>
> > > > 
>
> > > > class Base(models.Model):
>
> > > > 
>
> > > > plano = models.ForeignKey(Plano)
>
> > > > 
>
> > > > 
>
> > > > 
>
> > > > 
>
> > > > 
>
> > > > class Meta:
>
> > > > 
>
> > > > abstract = True
>
> > > > 
>
> > > > 
>
> > > > 
>
> > > > 
>
> > > > 
>
> > > > base_manager_name
>
> > > > 
>
> > > > <https://docs.djangoproject.com/en/1.10/ref/models/options/#base-m
>
> > > > an

Re: Subquery has too many columns

2017-02-21 Thread eltonplima
This is part of my real code but demonstrate the issue in pratice:

from django.db import models

class ProdutoServicoManager(models.Manager):
def get_queryset(self):
custo_unitario = models.F('custounitario__valor')
quantidade = models.F('custounitario__quantidade')
expression = models.Sum(custo_unitario * quantidade)
custo_producao_expr = models.ExpressionWrapper(expression,
  
 output_field=models.DecimalField())
return 
super().get_queryset().annotate(custo_producao=custo_producao_expr)


class ProdutoServico(models.Model):
produto = models.BooleanField(default=True)
descricao = models.TextField()
objects = ProdutoServicoManager()

class Meta:
#
# Comment the line below and the test pass.
#
base_manager_name = 'objects'


class CustoUnitario(models.Model):
produto_servico = models.ForeignKey(ProdutoServico)
item = models.CharField(max_length=128)
quantidade = models.PositiveIntegerField()
valor = models.DecimalField(max_digits=10,
decimal_places=4,
verbose_name='Valor unitário')


class Faturamento(models.Model):
produto_servico = models.OneToOneField(ProdutoServico)
quantidade = models.PositiveIntegerField()
preco_unitario = models.DecimalField(max_digits=10, decimal_places=2)

# We need only a single simple test to demonstrate this issue.

from django.test import TestCase
from django.db import utils

from model_mommy import mommy

from core import models

class FaturamentoTest(TestCase):

def test(self):
faturamento = mommy.make(models.Faturamento)
produto = faturamento.produto_servico
try:
produto.save()
except utils.OperationalError:
self.fail("Whats wrong?")




On Tuesday, February 21, 2017 at 9:01:50 AM UTC-3, Melvyn Sopacua wrote:
>
> On Monday 20 February 2017 17:09:40 eltonplima wrote:
>
> > Base class is abstract.
>
> > 
>
> > class Base(models.Model):
>
> > plano = models.ForeignKey(Plano)
>
> > 
>
> > 
>
> > class Meta:
>
> > abstract = True
>
> > 
>
> > 
>
> > base_manager_name
>
> > <https://docs.djangoproject.com/en/1.10/ref/models/options/#base-manag
>
> > er-name>
>
>  
>
> Ack, my brain kept reading "default_manager_name".
>
> Still - without a ForeignKey this shouldn't break anything. It seems it 
> warrents a new bug report, but I'm curious where things break. It looks 
> like this model is used as an inline in the admin. Is that correct?
>
>  
>
> I cannot reproduce this with a simple test case:
>
>  
>
> models:
>
> class CartEntryManager(models.Manager):
> def get_queryset(self):
> qs = super(CartEntryManager, self).get_queryset()
> expression = models.F('quantity') * models.F('price')
> wrapped = models.ExpressionWrapper(expression,
> output_field=models.DecimalField(
> max_digits=20, decimal_places=2))
> return qs.annotate(amount=wrapped)
>
>
> class Cart(models.Model):
> created = models.DateTimeField(auto_now_add=True)
>
>
> class CartEntry(models.Model):
> item = models.CharField(max_length=32, primary_key=True)
> quantity = models.PositiveSmallIntegerField()
> price = models.DecimalField(max_digits=20, decimal_places=2)
> cart = models.ForeignKey(Cart, on_delete=models.CASCADE,
> related_name='items')
> is_shipped = models.BooleanField(default=False)
> objects = CartEntryManager()
>
> class Meta:
> base_manager_name = 'objects'
>
> tests:
>
> class CartTest(TestCase):
> @classmethod
> def setUpTestData(cls):
> cart = models.Cart()
> cart.save()
> keyboard = models.CartEntry(
> item='Komplete Kontrol S88',
> quantity=2,
> price='999.00',
> cart=cart
> )
> mixer = models.CartEntry(
> item='Traktor Kontrol S8',
> quantity=1,
> price='1199.00',
> cart=cart
> )
> keyboard.save()
> mixer.save()
> cls.cart = cart
> cls.keyboard = keyboard
> cls.mixer = mixer
>
> def test_entry_annotation(self):
> self.assertEqual(self.keyboard.amount, 1998)
>
> def test_base_manager(self):
> from decimal import Decimal
> total = Decimal('0.00')
> for item in self.cart.items.all():
> total += item.amount
>
> total = total.quantize(Decimal('0.01'))
> expect = Decimal('3197.00').quantize(Decimal('0.01'))
> self.assertEqual(total, expec

Re: Subquery has too many columns

2017-02-20 Thread eltonplima
Base class is abstract.

class Base(models.Model):
plano = models.ForeignKey(Plano)


class Meta:
abstract = True


base_manager_name 



On Saturday, February 18, 2017 at 9:20:03 PM UTC-3, Melvyn Sopacua wrote:
>
> On Saturday 18 February 2017 22:27:46 Elton Pereira wrote:
>
>  
>
> > class ProdutoServicoManager(models.Manager):
>
> > def get_queryset(self):
>
> > expression = models.Sum(models.F('custounitario__valor') *
>
> > models.F('custounitario__quantidade'))
>
> > total_expr = models.ExpressionWrapper(expression,
>
> > output_field=models.DecimalField())
>
> > return
>
> > super().get_queryset().annotate(custo_producao=total_expr)
>
> > 
>
> > class ProdutoServico(Base):
>
>  
>
> What's the manager on Base?
>
>  
>
> > produto = models.BooleanField(default=True)
>
> > descricao = models.TextField()
>
> > objects = ProdutoServicoManager()
>
> > 
>
> > class Meta:
>
> > base_manager_name = 'objects'
>
>  
>
> Cause this doesn't actually do anything, beside being explicit.
>
>  
>
> -- 
>
> Melvyn Sopacua
>

-- 
You received this message because you are subscribed to the Google Groups 
"Django users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to django-users+unsubscr...@googlegroups.com.
To post to this group, send email to django-users@googlegroups.com.
Visit this group at https://groups.google.com/group/django-users.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/django-users/1f0c3fe3-9724-4a0f-b362-2d334ccaf3e7%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.