207๐
get()
returned more than one topic โ it returned 2!
The above error indicatess that you have more than one record in the DB related to the specific parameter you passed while querying using get()
such as
Model.objects.get(field_name=some_param)
To avoid this kind of error in the future, you always need to do query as per your schema design.
In your case you designed a table with a many-to-many relationship so obviously there will be multiple records for that field and that is the reason you are getting the above error.
So instead of using get()
you should use filter()
which will return multiple records. Such as
Model.objects.filter(field_name=some_param)
Please read about how to make queries in django here.
23๐
get()
returns a single object. If there is no existing object to return, you will receive <class>.DoesNotExist
. If your query returns more than one object, then you will get MultipleObjectsReturned
. You can check here for more details about get() queries.
Similarly, Django will complain if more than one item matches the get() query. In this case, it will raise MultipleObjectsReturned, which again is an attribute of the model class itself.
M2M will return any number of query that it is related to. In this case you can receive zero, one or more items with your query.
In your models you can us following:
for _topic in topic.objects.all():
_topic.learningobjective_set.all()
you can use _set
to execute a select query on M2M. In above case, you will filter all learningObjective
s related to each topic
- [Django]-What is the easiest way to clear a database from the CLI with manage.py in Django?
- [Django]-Django: How to format a DateField's date representation?
- [Django]-Django โ Static file not found
6๐
Get is supposed to return, one and exactly one record, to fix this use filter()
, and then take first element of the queryset returned to get the object you were expecting from get, also it would be useful to check if atleast one record is returned before taking out the first element to avoid IndexError
- [Django]-Class has no objects member
- [Django]-What is related_name used for?
- [Django]-How to make two django projects share the same database
- [Django]-How to set environment variables in PyCharm?
- [Django]-How can I disable logging while running unit tests in Python Django?
- [Django]-Django Static files 404
4๐
In your Topic
model youโre allowing for more than one element to have the same topic
field. You have created two with the same one already.
topic=models.TextField(verbose_name='Thema')
Now when trying to add a new learningObjective
you seem to want to add it to only one Topic
that matches what youโre sending on the form. Since thereโs more than one with the same topic
field get
is finding 2, hence the exception.
You can either add the learningObjective
to all Topics with that topic
field:
for t in topic.objects.filter(topic=request.POST['Thema']):
t.learningObjectivesTopic.add(neuesLernziel)
or restrict the Topic
model to have a unique topic
field and keep using get
, but that might not be what you want.
- [Django]-DatabaseError: current transaction is aborted, commands ignored until end of transaction block?
- [Django]-Django form: what is the best way to modify posted data before validating?
- [Django]-Why does DEBUG=False setting make my django Static Files Access fail?
0๐
To add to CrazyGeekโs answer, get
or get_or_create
queries work only when thereโs one instance of the object in the database, filter
is for two or more.
If a query can be for single or multiple instances, itโs best to add an ID to the div and use an if statement e.g.
def updateUserCollection(request):
data = json.loads(request.body)
card_id = data['card_id']
action = data['action']
user = request.user
card = Cards.objects.get(card_id=card_id)
if data-action == 'add':
collection = Collection.objects.get_or_create(user=user, card=card)
collection.quantity + 1
collection.save()
elif data-action == 'remove':
collection = Cards.objects.filter(user=user, card=card)
collection.quantity = 0
collection.update()
Note: .save()
becomes .update()
for updating multiple objects. Hope this helps someone, gave me a long dayโs headache.
- [Django]-405 "Method POST is not allowed" in Django REST framework
- [Django]-How can i test for an empty queryset in Django?
- [Django]-Cannot set Django to work with smtp.gmail.com
0๐
Use this in the case when you required one record but youโre not having a primary key or unique to identify the object.
XYZ.objects.filter(model_attribute=your_value)[0]
This will return a normal object same as the .get()
.
- [Django]-Django modelform NOT required field
- [Django]-How do you catch this exception?
- [Django]-Error: No module named psycopg2.extensions
0๐
Use .filter then use .latest selection by pk to get one object from filtered ones
tempobj = Flattable()
try:
tempobj = Flattable.objects.filter(org_address__icontains=row[5]).latest('pk')
except Flattable.DoesNotExist:
tempobj = None
- [Django]-Django-social-auth django-registration and django-profiles โ together
- [Django]-Django count RawQuerySet
- [Django]-Django REST Framework โ 405 METHOD NOT ALLOWED using SimpleRouter
-1๐
Donโt :-
xyz = Blogs.objects.get(user_id=id)
Use:-
xyz = Blogs.objects.all().filter(user_id=id)
- [Django]-Can't compare naive and aware datetime.now() <= challenge.datetime_end
- [Django]-Django Sitemaps and "normal" views
- [Django]-Django/DRF โ 405 Method not allowed on DELETE operation