Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Django error 'RawQuerySet' object has no attribute 'all'

Tags:

python

django

I got this error message if I'm using SQL statement to populate data in dropdown.

Error message

'RawQuerySet' object has no attribute 'all'

Model.py

@python_2_unicode_compatible  # only if you need to support Python 2
class FacebookAccount(models.Model):
    user = models.ForeignKey(User)
    account_description = models.CharField(max_length=50)
    facebook_application_id = models.CharField(max_length=50)
    facebook_application_secret = models.CharField(max_length=50)
    ouath_token = models.CharField(max_length=500)
    status = models.BooleanField(default=False)

    def __str__(self):
        return self.account_description

@python_2_unicode_compatible  # only if you need to support Python 2
class FacebookFanPage(models.Model):
    facebook_account = models.ForeignKey(FacebookAccount)
    fan_page_description = models.CharField(max_length=50)
    fan_page_id = models.CharField(max_length=30)
    fan_page_access_token = models.CharField(max_length=500, null=True)

    def __str__(self):
        return self.fan_page_description

class Campaign(models.Model):
    aList = (
        ('1', 'Send replies to inbox messages'),
        ('2', 'Post replies to users comments')
    )
    user = models.ForeignKey(User)
    campaign_name = models.CharField(max_length=50)
    autoresponder_type = models.CharField(max_length=10, choices=aList, null=True)
    facebook_account_to_use = models.ForeignKey(FacebookAccount)
    set_auto_reply_for_fan_page = models.ForeignKey(FacebookFanPage)
    message_list_to_use = models.ForeignKey(PredefinedMessage)
    #reply_only_in_this_hourly_interval
    reply_only_for_this_keyword = models.CharField(max_length=50, null=True)

View.py

def autoresponder_create(request, template_name='autoresponder/autoresponder_form.html'):
if not request.user.is_authenticated():
    return redirect('home')
form = AutoresponderForm(request.POST or None)
form.fields["set_auto_reply_for_fan_page"].query = FacebookFanPage.objects.raw('SELECT * '
                                         'FROM fbautoreply_facebookfanpage '
                                         'JOIN fbautoreply_facebookaccount ON fbautoreply_facebookfanpage.facebook_account_id = fbautoreply_facebookaccount.id '
                                         'WHERE fbautoreply_facebookaccount.user_id = %s ', [str(request.user.id)])
if form.is_valid():
    form = form.save(commit=False)
    form.user = request.user
    form.save()
    return redirect('autoresponder_list')
return render(request, template_name, {'form':form})
like image 436
Nurdin Avatar asked Apr 20 '26 09:04

Nurdin


1 Answers

As the first comment says it seems like you are calling all() on queryset. You dont have to call .all() after executing raw sql queries, if you are assigning that to a variable since that variable already includes all objects fetched by your query.

In [6]: t = Team.objects.raw('SELECT * FROM core_team')

In [7]: t
Out[7]: <RawQuerySet: SELECT * FROM core_team>

In [8]: t[0]
Out[8]: <Team: test>
In [9]: [x for x in t ]
Out[9]: [<Team: test>, <Team: team2>, <Team: adminTeam>, <Team: team4>]

and if you call t.all()

In [11]: t.all()
    ---------------------------------------------------------------------------
    AttributeError                            Traceback (most recent call last)
    <ipython-input-11-2ce0015f044f> in <module>()
    ----> 1 t.all()

    AttributeError: 'RawQuerySet' object has no attribute 'all'

    In [12]: 

So it seems like you are calling all() on after executing a sql raw query. Remove that piece of code and it will be solved. You can refer to this section of django docs if you want to use better ways to execute a sql query.

Edit

Try changing form.fields["set_auto_reply_for_fan_page"].query to form.fields["set_auto_reply_for_fan_page"].queryset

like image 195
cutteeth Avatar answered Apr 21 '26 22:04

cutteeth