【问题标题】:Django Import-Export User Foreignkey & M2M Import Logic CheckDjango 导入导出用户外键和 M2M 导入逻辑检查
【发布时间】:2020-07-18 20:03:36
【问题描述】:

网络逻辑

  1. 用户创建一个新的交易对象(输入代码、经纪人、票据等数据)
  2. 交易还是空的
  3. 用户现在为此交易创建条目(例如 100 股 @ 5 美元买入)
  4. 交易必须至少有 2 个整体才能成为平仓交易
  5. 条目添加在与使用 inlineformset_factory 创建交易相同的表单页面上

Model.py

class Trade(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE, blank=True)
    status = models.CharField(max_length=2, choices=STATUS_CHOICES, default='cl')
    type = models.CharField(max_length=5, choices=TYPE_CHOICES, default=LONG)
    broker = models.ForeignKey(Broker, on_delete=models.CASCADE, blank=True, null=True)
    asset = models.ForeignKey(Asset, default=DEFAULT_ASSET_ID, on_delete=models.CASCADE, null=True)
    symbol = models.ForeignKey(Symbol, on_delete=models.CASCADE, blank=True, null=True)
    patterns = models.ManyToManyField(Pattern, blank=True)
    notes = RichTextUploadingField(blank=True, null=True)
    created = models.DateTimeField(editable=False)
    modified = models.DateTimeField(editable=False)
    associated_portfolios = models.ManyToManyField(Portfolio, blank=True)
    image = models.FileField(default='no-image-available-icon.jpg', upload_to=user_directory_path, null=True, blank=True)

  
class Entry(models.Model):
    trade = models.ForeignKey(Trade, on_delete=models.CASCADE)
    date = models.DateTimeField(null=True, blank=True, default=datetime.datetime.now)
    amount = models.FloatField(null=True)
    price = models.FloatField(null=True)
    fee = models.FloatField(null=True, blank=True)
    entry_type = models.CharField(max_length=5, choices=ENTRY_TYPE_CHOICES, default=ENTRY)
    reg_fee = models.FloatField(null=True, blank=True)
    transaction_id = models.CharField(max_length=100, null=True, blank=True)

CSV 数据示例(我添加了空格而不是“,”以便更轻松地显示数据)

Date/Time               Description                 Amount  Commission  RegFee  NetCashBalance  
07/17/2020 7:42:39      Bought 40 APDN @ 14.56      -582.4      0       0       25,755.84
07/17/2020 7:47:16      Bought 40 APDN @ 14.78      -591.2      0       0       25,164.64
07/17/2020 7:53:36      Bought 20 APDN @ 14.27      -285.4      0       0       24,879.24
07/17/2020 8:04:01      Bought 100 VRNA @ 9.58      -958        0       0       23,921.24
07/17/2020 8:05:01      Bought 20 VRNA @ 9.47       -189.4      0       0       23,731.84
07/17/2020 8:05:27      Sold 21 APDN @ 14.885       312.58      0       0.01    24,044.42
07/17/2020 8:05:27      Sold 79 APDN @ 14.87        1,174.69    0       0.04    25,219.11
07/17/2020 8:06:43      Sold 120 VRNA @ 10.08       1,209.56    0       0.04    26,428.67

如果根据代理导出的 CSV 文件,它还没有击中你,这将是一个超级混乱的过程,我们需要分析大量数据,正确匹配它,创建新对象,并创建多个基于新创建的对象的新的 forieng 关键对象。

CSV 导入逻辑

为了节省时间,用户最好只导入经纪商提供的交易数据。这是一个example site(不是我的项目)也可以。

1. Create an Entry class object (user may need to manually make csv file for cleaner data import)
2. find Trade object where Status == Open and symbol == symbol
3. if step 2 == None then create a new Trade class & assign status to open
4. Def & set Set Symbol_Share_Count == 0
5. Increment or Decrease Symbol_Share_Count by shares
6. Once Symbol_Share_Count == 0 close the trade

3. if step 2 retuns a Trade object then..
4. Def & set Set Symbol_Share_Count == "# of total open shares"
5. Increment or Decrease Symbol_Share_Count by shares of newly imported transaction
6. Once Symbol_Share_Count == 0 close the trade

7. At this point the new or found Trade object is done and a new Trade object can be created or found based on the next transaction

这个逻辑有意义吗?是否存在我忽略的严重问题?

非常感谢任何反馈!

【问题讨论】:

    标签: django postgresql csv import django-import-export


    【解决方案1】:

    您在导入期间有几个逻辑步骤,但django-import-export 提供了可用于管理相关对象更新的逻辑挂钩。 documentation 列出了所有这些。

    例如,如果您使用after_save_instance(),那么您可以在上传对象成功持久化后进行所需的任何逻辑更改。

    如果需要,您可以在事务中运行整个导入。

    您可能需要考虑的其他几点:

    1. 如果用户导入大量数据,您将在网络服务器上占用一个线程,并可能面临超时风险。这对于小型上传是可以的,但对于较大的上传,您需要异步运行导入。 Celery 在这里可能会有所帮助。

    2. 如果导入过程中途崩溃会怎样?你能干净地回滚吗? (Transactions 会在这里提供帮助)。

    3. 如果用户两次上传同一个文件会怎样?如果他们的连接中断,他们可能会这样做。您的导入过程会避免创建重复项吗?想想使进程幂等所需的逻辑。你可以写自己的逻辑到skip duplicates

    4. 是否有任何订购问题?文件A需要在文件B之前导入吗?

    5. 该进程会同时处理多个上传吗?对多个对象的事务和更新可能存在死锁风险。

    您可能需要考虑使用批处理框架来解决上述一些问题。换句话说,一旦文件上传,批处理将独立于 Web 服务器处理导入。这显然需要做更多的工作,但会提供更强大的解决方案。

    【讨论】:

    • 仍在解决这个问题,我会尽快评论更多信息。非常感谢您的深入回复!
    • 嘿,我仍然坚持这个。用 after_save_instance 做了很多尝试,但我想我可能需要使用 after_import_row 来计算股票有多少股,这样一旦计数回到 0,我就可以创建一个新的交易对象。我会尽快尝试修改我的问题,但是也许您知道如何根据一些简单的输入数学创建一个新的交易对象?
    • 我建议发布一个新问题(而不是修改这个问题),因为这个问题可能会对未来的用户有所帮助。如果数学基于单行,this 可能会有所帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-21
    • 1970-01-01
    • 1970-01-01
    • 2020-11-17
    • 1970-01-01
    • 2015-11-28
    • 2015-05-28
    相关资源
    最近更新 更多