Code: Select all
> E:\1. APP\finance_app>docker-compose exec web python manage.py migrate
Operations to perform:
Apply all migrations: admin, auth, contenttypes, finance, sessions
Running migrations:
Applying finance.0004_investment_pnl_investment_total_worth...Traceback (most recent call last):
File "/app/manage.py", line 22, in
main()
File "/app/manage.py", line 18, in main
execute_from_command_line(sys.argv)
File "/usr/local/lib/python3.11/site-packages/django/core/management/__init__.py", line 442, in execute_from_command_line
utility.execute()
File "/usr/local/lib/python3.11/site-packages/django/core/management/__init__.py", line 436, in execute
self.fetch_command(subcommand).run_from_argv(self.argv)
File "/usr/local/lib/python3.11/site-packages/django/core/management/base.py", line 413, in run_from_argv
self.execute(*args, **cmd_options)
File "/usr/local/lib/python3.11/site-packages/django/core/management/base.py", line 459, in execute
output = self.handle(*args, **options)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.11/site-packages/django/core/management/base.py", line 107, in wrapper
res = handle_func(*args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.11/site-packages/django/core/management/commands/migrate.py", line 357, in handle
post_migrate_state = executor.migrate(
^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.11/site-packages/django/db/migrations/executor.py", line 135, in migrate
state = self._migrate_all_forwards(
^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.11/site-packages/django/db/migrations/executor.py", line 167, in _migrate_all_forwards
state = self.apply_migration(
^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.11/site-packages/django/db/migrations/executor.py", line 255, in apply_migration
state = migration.apply(state, schema_editor)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.11/site-packages/django/db/migrations/migration.py", line 132, in apply
operation.database_forwards(
File "/usr/local/lib/python3.11/site-packages/django/db/migrations/operations/fields.py", line 110, in database_forwards
schema_editor.add_field(
File "/usr/local/lib/python3.11/site-packages/django/db/backends/base/schema.py", line 722, in add_field
definition, params = self.column_sql(model, field, include_default=True)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.11/site-packages/django/db/backends/base/schema.py", line 383, in column_sql
" ".join(
File "/usr/local/lib/python3.11/site-packages/django/db/backends/base/schema.py", line 330, in _iter_column_sql
default_value = self.effective_default(field)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.11/site-packages/django/db/backends/base/schema.py", line 483, in effective_default
return field.get_db_prep_save(self._effective_default(field), self.connection)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.11/site-packages/django/db/models/fields/__init__.py", line 1008, in get_db_prep_save
return self.get_db_prep_value(value, connection=connection, prepared=False)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.11/site-packages/django/db/models/fields/__init__.py", line 1677, in get_db_prep_value
value = self.get_prep_value(value)
^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.11/site-packages/django/db/models/fields/__init__.py", line 1655, in get_prep_value
value = super().get_prep_value(value)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.11/site-packages/django/db/models/fields/__init__.py", line 1531, in get_prep_value
return self.to_python(value)
^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.11/site-packages/django/db/models/fields/__init__.py", line 1616, in to_python
parsed = parse_datetime(value)
^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.11/site-packages/django/utils/dateparse.py", line 114, in parse_datetime
return datetime.datetime.fromisoformat(value)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
TypeError: fromisoformat: argument must be str
< /code>
Hier ist der Code, der den Fehler erhöht: < /p>
class Transaction(models.Model):
TRANSACTION_TYPES = (
('income', 'Income'),
('expense', 'Expense'),
)
RECURRENCE_TYPES = (
('daily', 'Daily'),
('weekly', 'Weekly'),
('biweekly', 'Bi-Weekly'),
('monthly', 'Monthly'),
)
user = models.ForeignKey(User, on_delete=models.CASCADE)
transaction_type = models.CharField(max_length=7, choices=TRANSACTION_TYPES)
amount = models.DecimalField(max_digits=10, decimal_places=2)
description = models.CharField(max_length=255)
category = models.CharField(max_length=255, blank=True, null=True) # Optional category field
recurrence = models.CharField(max_length=10, choices=RECURRENCE_TYPES, blank=True, null=True) # Recurrence rule
next_due_date = models.DateField(blank=True, null=True) # The next date when this transaction will be added
transaction_date = models.DateTimeField(default=timezone.now)
def __str__(self):
# Check if transaction_date is set and valid before formatting
if self.transaction_date:
return f"{self.transaction_type} of {self.amount} on {self.transaction_date}"
else:
return f"{self.transaction_type} of {self.amount}"
def save(self, *args, **kwargs):
print(f"Saving transaction_date: {self.transaction_date}")
if self.recurrence and not self.next_due_date:
# Set the next_due_date based on the recurrence type
if self.recurrence == 'daily':
self.next_due_date = self.transaction_date.date() + timedelta(days=1)
elif self.recurrence == 'weekly':
self.next_due_date = self.transaction_date.date() + timedelta(weeks=1)
elif self.recurrence == 'biweekly':
self.next_due_date = self.transaction_date.date() + timedelta(weeks=2)
elif self.recurrence == 'monthly':
self.next_due_date = self.transaction_date.date().replace(month=self.transaction_date.month+1) # Simplified monthly logic
super().save(*args, **kwargs)
< /code>
Hier sind auch meine bereits hergestellten Transaktionen.:
[{"id":1,"user":1,"transaction_type":"expense","amount":"33.00","description":"Cosmote","category":null,"recurrence":null,"next_due_date":null,"transaction_date":"2025-03-26T14:03:02.430961Z"},{"id":2,"user":1,"transaction_type":"income","amount":"1000.00","description":".","category":"Salary","recurrence":"monthly","next_due_date":"2025-03-03","transaction_date":"2025-03-26T14:03:02.430961Z"},{"id":3,"user":1,"transaction_type":"income","amount":"1000.00","description":".","category":"Salary","recurrence":"monthly","next_due_date":"2025-03-03","transaction_date":"2025-03-26T14:03:02.430961Z"},{"id":4,"user":1,"transaction_type":"income","amount":"450.00","description":"Rent","category":"Rent","recurrence":"biweekly","next_due_date":"2025-03-01","transaction_date":"2025-03-26T14:03:02.430961Z"}]
< /code>
Letzte hier ist die Migration 0004 Sehen Sie aus: < /p>
# Generated by Django 5.1.6 on 2025-02-20 12:43
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('finance', '0003_rename_amount_investment_purchase_price_and_more'),
]
operations = [
migrations.AddField(
model_name='investment',
name='pnl',
field=models.DateTimeField(default=0.0),
),
migrations.AddField(
model_name='investment',
name='total_worth',
field=models.DateTimeField(default=0.0),
),
]
< /code>
Letzte Migration habe ich gemacht: < /p>
# Generated by Django 5.1.6 on 2025-03-26 14:21
import django.utils.timezone
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('finance', '0028_transaction_transaction_date'),
]
operations = [
migrations.AlterField(
model_name='transaction',
name='transaction_date',
field=models.DateTimeField(default=django.utils.timezone.now),
),
]
< /code>
Ich kann den Grund, warum dies geschieht, nicht verstehen. Ich habe versucht, direkt TimeZone zu verwenden.transaction_date = timezone.now()
transaction_date = models.DateTimeField(default=timezone.now)
but it got the same error, also tries using if else statement to check in the str function but nothing
last i tried using this format in str
Code: Select all
return f"{self.transaction_type} of {self.amount} on {self.transaction_date}"
return f"{self.transaction_type} of {self.amount} on {self.transaction_date.strftime('%B %d, %Y')}"
< /code>
Irgendeine Idee, warum kann dies geschehen?class Investment(models.Model):
name = models.CharField(max_length=100) # e.g., Bitcoin, Tesla
symbol = models.CharField(max_length=10, unique=True) # e.g., BTC, TSLA
quantity = models.DecimalField(max_digits=10, decimal_places=4 , default=0.0) # Number of shares/coins
purchase_price= models.DecimalField(max_digits=10, decimal_places=2) # Price at purchase
current_price = models.DecimalField(max_digits=10, decimal_places=2, null=True, blank=True) # Real-time price
investment_type = models.CharField(max_length=20, choices=[('Stock', 'Stock'), ('Crypto', 'Crypto')])
last_updated = models.DateTimeField(default=timezone.now, null=True , blank=True)
#total_worth = models.DecimalField(max_digits=15 , decimal_places=4 , default=0.0)
#pnl = models.DecimalField(max_digits=15 ,decimal_places=4 , default=0.0)
def __str__(self):
return f"{self.name} ({self.symbol}) - {self.quantity} units"
def total_worth(self):
"""Total worth of this investment"""
return self.quantity * self.current_price if self.current_price else Decimal('0.0')
def pnl(self):
"""Profit and Loss calculation"""
return (self.current_price - self.purchase_price) * self.quantity if self.current_price else Decimal('0.0')
# Automatically calculate total worth and PnL when saving
"""def update_total_worth(self):
self.total_worth = self.amount_invested * self.current_price
self.save()
"""
def save(self, *args, **kwargs):
#self.total_worth = self.current_price * self.quantity if self.current_price else 0.0
#self.pnl = self.total_worth - (self.purchase_price * self.quantity)
super().save(*args, **kwargs) # Call the original save method