How i can acces to another class, while i'm enter the information for the first class from shell? - django-models

I'm trying to fill write the models from shell and i was trying to fill the information for input has ( ForeignKey ) that make it access to another class.
that is my code in pycharm :
class Team(models.Model):
name = models.CharField(max_length=256, unique=True)
details = models.TextField()
def __str__(self):
return self.name
class Player(models.Model):
name = models.CharField(max_length=256)
number = models.IntegerField()
age = models.IntegerField()
position_in_field = models.CharField(max_length=256, choices=(('1', 'حارس'), ('2', 'دفاع'), ('3', 'وسط'), ('4', 'هجوم')))
is_captain = models.BooleanField(default=False)
team = models.ForeignKey(Team)
def __str__(self):
return '{} - {}'.format(self.name, self.team)
and this is the result:
python manage.py shell
Python 3.7.2 (tags/v3.7.2:9a3ffc0492, Dec 23 2018, 22:20:52) [MSC v.1916 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>> from teams.models import Player
>>> from teams.models import Team
>>> Player.objects.create(name='محمد إبراهيم', number='25', age='27', position_in_field='هجوم', is_captain=False, team='فريق الزمالك')
Traceback (most recent call last):
File "<console>", line 1, in <module>
File "D:\cj\projects\django\teammanager_env\lib\site-packages\django\db\models\manager.py", line 85, in manager_method
return getattr(self.get_queryset(), name)(*args, **kwargs)
File "D:\cj\projects\django\teammanager_env\lib\site-packages\django\db\models\query.py", line 392, in create
obj = self.model(**kwargs)
File "D:\cj\projects\django\teammanager_env\lib\site-packages\django\db\models\base.py", line 555, in __init__
_setattr(self, field.name, rel_obj)
File "D:\cj\projects\django\teammanager_env\lib\site-packages\django\db\models\fields\related_descriptors.py", line 216, in __set__
self.field.remote_field.model._meta.object_name,
ValueError: Cannot assign "'فريق الزمالك'": "Player.team" must be a "Team" instance.

When you create a record with a foreign key, you have to indicate the record in the referenced model through its primary key.
In the case of model Team, you didn't set a primary key explicitly, so Djangosets de default field mode_id, that is a autoincremental PositiveIntegerField, that is what you have to indicate in the referencing record.
Player.objects.create(name='محمد إبراهيم', number='25', age='27', position_in_field='هجوم', is_captain=False, team_id=1)
If you have a model object with the referenced team, you can use it too:
Player.objects.create(name='محمد إبراهيم', number='25', age='27', position_in_field='هجوم', is_captain=False, team=team_instance)

Related

When trying to create an account number, I get an IntegrityError: FOREIGN KEY constraint failed

I want that when creating an account number, the owner of the account be the current logged-in user.
I have read about foreign key constraints but do not know what constraint the CustomUser class is having to conflict the creation of an account number.
I have tried setting on_delete to CASCADE but still it throws the IntegrityError
Please help. Thanks.
My models.py
class CustomUser(TrackingModel, AbstractUser, PermissionsMixin):
GENDER = (
("F", "Female"),
("M", "Male"),
("NS", "Not Specified"),
)
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
phone = models.CharField(max_length=20)
gender = models.CharField(max_length=6, choices=GENDER)
USERNAME_FIELD = "username"
REQUIRED_FIELDS = [
"phone",
]
#property
def token(self):
token = jwt.encode(
{
"username": self.username,
"email": self.email,
"exp": datetime.utcnow() + timedelta(hours=24),
},
settings.SECRET_KEY,
algorithm="HS256",
)
return token
def __str__(self):
return self.username
class Accountnumber(TrackingModel):
TYPE = (
("momo", "MTN Mobile Money"),
("om", "Orange Money"),
("visa", "Visa"),
("paypal", "Paypal"),
)
number = models.AutoField(primary_key=True, editable=False, default=9999)
type = models.CharField(
max_length=10,
choices=TYPE,
null=True,
default="momo",
)
customuser = models.ForeignKey(
CustomUser,
related_name="acc_no_user",
on_delete=models.CASCADE,
)
cdate = models.DateTimeField(auto_now_add=True)
enddate = models.DateTimeField(auto_now_add=True)
transactions = models.ForeignKey(
"Transaction",
related_name="acc_no_transactions",
on_delete=models.CASCADE,
default="2",
)
balance = models.PositiveIntegerField(
null=True,
blank=True,
default=00,
)
def __str__(self):
return self.number
My views.py:
class CreateAccountnumberAPIView(CreateAPIView):
serializer_class = AccountnumberSerializer
permission_classes = {
IsAuthenticated,
}
def perform_create(self, serializer):
return serializer.save(user=self.request.user)
My serializers.py:
class AccountnumberSerializer(serializers.ModelSerializer):
class Meta:
model = Accountnumber
fields = (
"number",
"type",
"cdate",
"enddate",
"transactions",
"balance",
)
My stacktrace shows at perform_create() at views.py:
Internal Server Error: /api/v1/wallet/v1/account
Traceback (most recent call last):
File "C:\Users\USER\Documents\Dev\API\grand\.venv\lib\site-packages\django\db\utils.py", line 98, in inner
return func(*args, **kwargs)
sqlite3.IntegrityError: FOREIGN KEY constraint failed
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File "C:\Users\USER\Documents\Dev\API\grand\.venv\lib\site-packages\django\core\handlers\exception.py", line 55, in inner
response = get_response(request)
File "C:\Users\USER\Documents\Dev\API\grand\.venv\lib\site-packages\django\core\handlers\base.py", line 197, in _get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "C:\Users\USER\Documents\Dev\API\grand\.venv\lib\site-packages\django\views\decorators\csrf.py", line 54, in wrapped_view
return view_func(*args, **kwargs)
File "C:\Users\USER\Documents\Dev\API\grand\.venv\lib\site-packages\django\views\generic\base.py", line 84, in view
return self.dispatch(request, *args, **kwargs)
File "C:\Users\USER\Documents\Dev\API\grand\.venv\lib\site-packages\rest_framework\views.py", line 509, in dispatch
response = self.handle_exception(exc)
File "C:\Users\USER\Documents\Dev\API\grand\.venv\lib\site-packages\rest_framework\views.py", line 469, in handle_exception
self.raise_uncaught_exception(exc)
File "C:\Users\USER\Documents\Dev\API\grand\.venv\lib\site-packages\rest_framework\views.py", line 480, in raise_uncaught_exception
raise exc
File "C:\Users\USER\Documents\Dev\API\grand\.venv\lib\site-packages\rest_framework\views.py", line 506, in dispatch
response = handler(request, *args, **kwargs)
File "C:\Users\USER\Documents\Dev\API\grand\.venv\lib\site-packages\rest_framework\generics.py", line 190, in post
return self.create(request, *args, **kwargs)
File "C:\Users\USER\Documents\Dev\API\grand\.venv\lib\site-packages\rest_framework\mixins.py", line 19, in create
self.perform_create(serializer)
File "C:\Users\USER\Documents\Dev\API\grand\wallet\views.py", line 69, in perform_create
return serializer.save(customuser=self.request.user)
File "C:\Users\USER\Documents\Dev\API\grand\.venv\lib\site-packages\rest_framework\serializers.py", line
212, in save
self.instance = self.create(validated_data)
File "C:\Users\USER\Documents\Dev\API\grand\.venv\lib\site-packages\rest_framework\serializers.py", line
962, in create
instance = ModelClass._default_manager.create(**validated_data)
File "C:\Users\USER\Documents\Dev\API\grand\.venv\lib\site-packages\django\db\models\manager.py", line 85, in manager_method
return getattr(self.get_queryset(),
name)(*args, **kwargs)
File "C:\Users\USER\Documents\Dev\API\grand\.venv\lib\site-packages\django\db\models\query.py", line 514, in create
obj.save(force_insert=True, using=self.db)
File "C:\Users\USER\Documents\Dev\API\grand\.venv\lib\site-packages\django\db\models\base.py", line 806,
in save
self.save_base(
File "C:\Users\USER\Documents\Dev\API\grand\.venv\lib\site-packages\django\db\models\base.py", line 857,
in save_base
updated = self._save_table(
File "C:\Users\USER\Documents\Dev\API\grand\.venv\lib\site-packages\django\db\models\base.py", line 1000, in _save_table
results = self._do_insert(
File "C:\Users\USER\Documents\Dev\API\grand\.venv\lib\site-packages\django\db\models\base.py", line 1041, in _do_insert
return manager._insert(
File "C:\Users\USER\Documents\Dev\API\grand\.venv\lib\site-packages\django\db\models\manager.py", line 85, in manager_method
return getattr(self.get_queryset(),
name)(*args, **kwargs)
File "C:\Users\USER\Documents\Dev\API\grand\.venv\lib\site-packages\django\db\models\query.py", line 1434, in _insert
return query.get_compiler(using=using).execute_sql(returning_fields)
File "C:\Users\USER\Documents\Dev\API\grand\.venv\lib\site-packages\django\db\models\sql\compiler.py", line 1632, in execute_sql
self.connection.ops.fetch_returned_insert_columns(
File "C:\Users\USER\Documents\Dev\API\grand\.venv\lib\site-packages\django\db\backends\base\operations.py", line 208, in fetch_returned_insert_columns
return cursor.fetchone()
File "C:\Users\USER\Documents\Dev\API\grand\.venv\lib\site-packages\django\db\utils.py", line 97, in inner
with self:
File "C:\Users\USER\Documents\Dev\API\grand\.venv\lib\site-packages\django\db\utils.py", line 91, in __exit__
raise dj_exc_value.with_traceback(traceback) from exc_value
File "C:\Users\USER\Documents\Dev\API\grand\.venv\lib\site-packages\django\db\utils.py", line 98, in inner
return func(*args, **kwargs)
django.db.utils.IntegrityError: FOREIGN
KEY constraint failed
[13/Jan/2023 04:19:51] "POST /api/v1/wallet/v1/account HTTP/1.1" 500 183218
In your perform_create function you do the following:
def perform_create(self, serializer):
return serializer.save(user=self.request.user)
So you're saving the user variable to the user that made this request. That is fine, however, in your Accountnumber model, you store the user in the customuser field, not the user field.
Try to set your perform_create function to the following:
def perform_create(self, serializer):
return serializer.save(customuser=self.request.user)
All through, comments from my search for the answer have been that the IntegrityError of ForeignKey constriant failed mostly arises from the fact that you are trying to use a foreign key that does not yet exist and it was my case.
When creating an account number, I asked in my models.py that the field transactions be linked to the Transaction table foreign key WHICH DID NOT EXIST YET.
I, therefore, replaced the transaction field from referring to a ForeignKey to making it a CharField where I used the choices option and it worked.
Thanks, #Pavel Vergeev for editing my code
Thanks, #Ridape for pointing out an error which turns out was not the reason for the IntegrityError I was facing.

Field 'id' expected a number but got ' '. But I dont even have a field named 'id'

we are making a web app using Django, postgresql, and reactjs. I am creating two models and connecting them using one to one relationship in django. The view file is literally empty. This is models.py file I changed the primary key fields for each table to avoid the error but it isnot solving anything.I am new to Django. Please help.
from django.db import models
class userInfo(models.Model):
Username=models.CharField(max_length=100,primary_key=True)
Password=models.CharField(max_length=100)
def __str__(self):
return self.Username
class rentDetails(models.Model):
user=models.OneToOneField(
userInfo,
on_delete=models.CASCADE,
primary_key=True
)
floor_no=models.CharField(max_length=20,default=True)
distance=models.IntegerField(default=True)
location=models.CharField(max_length=200,default=True)
area=models.IntegerField(default=True)
no_of_rooms=models.IntegerField(default=True)
price=models.IntegerField(default=True)
property_choices=[
('hostel','Hostel'),
('house','House') ,
('room','Room'),
('flat','flat')
]
property_type=models.CharField(
max_length=10,
choices=property_choices,
)
images=models.ImageField(upload_to='uploads/',null=True)
#Here's the traceback:
Traceback (most recent call last):
File "C:\Users\acer\Documents\CHAANO\Chano\manage.py", line 22, in <module>
main()
File "C:\Users\acer\Documents\CHAANO\Chano\manage.py", line 18, in main
execute_from_command_line(sys.argv)
" ".join(
File "C:\Users\acer\Documents\python 310\lib\site-packages\django\db\backends\base\schema.py", line 296, in _iter_column_sql
default_value = self.effective_default(field)
File "C:\Users\acer\Documents\python 310\lib\site-packages\django\db\backends\base\schema.py", line 410, in effective_default
return field.get_db_prep_save(self._effective_default(field), self.connection)
File "C:\Users\acer\Documents\python 310\lib\site-packages\django\db\models\fields\related.py", line 1126, in get_db_prep_save
return self.target_field.get_db_prep_save(value, connection=connection)
File "C:\Users\acer\Documents\python 310\lib\site-packages\django\db\models\fields\__init__.py", line 910, in get_db_prep_save
return self.get_db_prep_value(value, connection=connection, prepared=False)
File "C:\Users\acer\Documents\python 310\lib\site-packages\django\db\models\fields\__init__.py", line 2668, in get_db_prep_value
value = self.get_prep_value(value)
File "C:\Users\acer\Documents\python 310\lib\site-packages\django\db\models\fields\__init__.py", line 1990, in get_prep_value
raise e.__class__(
ValueError: Field 'id' expected a number but got ' '.

what am I missing to get this error : <Cart: 22> is not JSON serializable?

Good day,
I'm getting the following error: is not JSON serializable
but I'm not sure why am I getting it. Everything was working fine until I decided to start making use of sessions to fire up my user cart adding and removal of items
This is my view:
def add_or_update_cart(request, slug):
request.session.set_expiry(180)
new_total = 0.00
try:
# check that session exists
the_cart_id = request.session['cart_id']
except:
new_cart_id = Cart()
new_cart_id.save()
request.session['cart_id'] = new_cart_id
the_cart_id = new_cart_id.id
cart = Cart.objects.get(id=the_cart_id)
try:
product = Product.objects.get(slug=slug)
except Product.DoesNotExist:
pass
except:
pass
if not product in cart.products.all():
cart.products.add(product)
else:
cart.products.remove(product)
for item in cart.products.all():
new_total += float(item.price)
request.session['items_total'] = cart.products.count()
cart.total = new_total
cart.save()
print(cart.products.count())
return HttpResponseRedirect(reverse('cart:cart'))
Models:
class Cart(models.Model):
products = models.ManyToManyField(Product, null=True, blank=True)
total = models.DecimalField(max_digits=100, decimal_places=2, default=0.00)
timestamp = models.DateTimeField(auto_now_add=True, auto_now=False)
updated = models.DateTimeField(auto_now_add=False, auto_now=True)
cart_status = models.BooleanField(default=False)
def __str__(self):
return '%s' % self.id
def item_name(self):
return " ".join([str(p) for p in self.product.all()])
and in my template:
<li role="presentation">Cart <span class="badge">{{ request.session.items_total }}</span></li>
The traceback:
Internal Server Error: /my-cart/puma/
Traceback (most recent call last):
File "/home/drcongo/.virtualenvs/eCommerce/lib/python3.4/site-packages/django/core/handlers/base.py", line 235, in get_response
response = middleware_method(request, response)
File "/home/drcongo/.virtualenvs/eCommerce/lib/python3.4/site-packages/django/contrib/sessions/middleware.py", line 50, in process_response
request.session.save()
File "/home/drcongo/.virtualenvs/eCommerce/lib/python3.4/site-packages/django/contrib/sessions/backends/db.py", line 82, in save
obj = self.create_model_instance(data)
File "/home/drcongo/.virtualenvs/eCommerce/lib/python3.4/site-packages/django/contrib/sessions/backends/db.py", line 68, in create_model_instance
session_data=self.encode(data),
File "/home/drcongo/.virtualenvs/eCommerce/lib/python3.4/site-packages/django/contrib/sessions/backends/base.py", line 88, in encode
serialized = self.serializer().dumps(session_dict)
File "/home/drcongo/.virtualenvs/eCommerce/lib/python3.4/site-packages/django/core/signing.py", line 95, in dumps
return json.dumps(obj, separators=(',', ':')).encode('latin-1')
File "/usr/lib/python3.4/json/__init__.py", line 237, in dumps
**kw).encode(obj)
File "/usr/lib/python3.4/json/encoder.py", line 192, in encode
chunks = self.iterencode(o, _one_shot=True)
File "/usr/lib/python3.4/json/encoder.py", line 250, in iterencode
return _iterencode(o, 0)
File "/usr/lib/python3.4/json/encoder.py", line 173, in default
raise TypeError(repr(o) + " is not JSON serializable")
TypeError: <Cart: 31> is not JSON serializable
I will appreciate any help on this.
The error arises when Django tries to serialize a model instance here
request.session['cart_id'] = new_cart_id
new_cart_id is a model instance and cannot be serialized.
It seems you wanted to assign the primary key of the instance to the key cart_id.
request.session['cart_id'] = new_cart_id.id

`objects.get(...)` does not work as expected

I'm trying to get an object from my neo4j database using neo4django
>>> # There is a single Person object in the database, so I get a value
>>> slug=Person.objects.get().name_slug
>>> print(slug)
doe-john
>>> # ok, it's there
>>> p=Person.objects.get(name_slug=slug)
Traceback (most recent call last):
File "<console>", line 1, in <module>
File "/[...]/src/neo4django/neo4django/db/models/manager.py", line 37, in get
return self.get_query_set().get(*args, **kwargs)
File "/[...]/lib/python2.7/site-packages/django/db/models/query.py", line 366, in get
% self.model._meta.object_name)
DoesNotExist: Person matching query does not exist.
>>> p=Person.objects.get(name_slug__exact=slug)
Traceback (most recent call last):
File "<console>", line 1, in <module>
File "/[...]/src/neo4django/neo4django/db/models/manager.py", line 37, in get
return self.get_query_set().get(*args, **kwargs)
File "/[...]/lib/python2.7/site-packages/django/db/models/query.py", line 366, in get
% self.model._meta.object_name)
DoesNotExist: Person matching query does not exist.
The error message is not sensible. I just received the queried string from the very field, so there must be a match. Any ideas? Or did I stumble upon a bug?
This is really strange, as it works with the other properties, but not with name_slug:
>>> Person.objects.get(surname='Doe')
<Person: Person object>
>>> Person.objects.get(given_name='John')
<Person: Person object>
>>> Person.objects.get(name_slug='john-doe')
Traceback (most recent call last):
File "<console>", line 1, in <module>
File "/[...]/src/neo4django/neo4django/db/models/manager.py", line 37, in get
return self.get_query_set().get(*args, **kwargs)
File "/[...]/lib/python2.7/site-packages/django/db/models/query.py", line 366, in get
% self.model._meta.object_name)
DoesNotExist: Person matching query does not exist.
>>> print( p.surname, p.given_name, p.name_slug )
(u'Doe', u'John', u'john-doe')
My model is defined as such:
class Person(models.NodeModel):
surname = models.StringProperty(required=True, indexed=True)
given_name = models.StringProperty(required=True, indexed=True)
name_slug = models.StringProperty(indexed=True)
So the only difference is that it's not required, but that should make no difference, in my understanding of the documentation.
I can't replicate this using neo4django master, on Neo4j 1.9.
I created a test_models.py
from neo4django.db import models
class Person(models.NodeModel):
class Meta:
# since test_models isn't in an app
app_label='test'
surname = models.StringProperty(required=True, indexed=True)
given_name = models.StringProperty(required=True, indexed=True)
name_slug = models.StringProperty(indexed=True)
and then ran
>>> from test_models import Person
>>> john = Person.objects.create(surname=u'Doe', given_name=u'John', name_slug=u'john-doe')
>>> Person.objects.get(name_slug='john-doe')
<Person: Person object>
>>> john == Person.objects.get(name_slug='john-doe')
True
>>> jane = Person.objects.create(surname=u'Doe', given_name=u'Jane', name_slug=u'jane-doe')
>>> jane == Person.objects.get(name_slug='jane-doe')
True
>>> jane == Person.objects.get(given_name='Jane', surname='Doe')
True
Thoughts?

Google App Engine + relational database - get ID

I have a question my db model looks like:
class UserAnswer (db.Model):
user = db.UserProperty()
name = db.StringProperty()
email = db.StringProperty()
occupation = db.IntegerProperty()
howreach = db.IntegerProperty()
rating = db.IntegerProperty()
comment = db.StringProperty(multiline=True)
class Involves(db.Model):
shortName = db.StringProperty()
fullName = db.StringProperty()
class UserInvolves(db.Model):
userAnswer = db.ReferenceProperty(UserAnswer)
involve = db.ReferenceProperty(Involves)
How can I do a select something like this:
def getInvolves(user):
results = db.GqlQuery("Select * from UserInvolves as ui where ui.userAnswer.ID='"+user.ID+"'")
I mean how I can get this id key? As when I try like above I recive an error:
Traceback (most recent call last):
File "C:\Program Files\Google\google_appengine\google\appengine\ext\webapp\__init__.py", line 517, in __call__
handler.post(*groups)
File "C:\Program Files\Google\google_appengine\demos\b00213576\main.py", line 217, in post
involves = getInvolves(answer)
File "C:\Program Files\Google\google_appengine\demos\b00213576\main.py", line 128, in getInvolves
results = db.GqlQuery("Select * from UserInvolves as ui where ui.userAnswer.ID='"+user.ID+"'")
AttributeError: 'UserAnswer' object has no attribute 'ID'
And I dont know how to convert to GAE :/
user_answer = UserAnswer.get_by_id(user.ID)
for user_involve in user_answer.userinvolves_set:
# these are your UserInvolves items

Resources