首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Django导入-导出用户Foreignkey & M2M导入逻辑检查

Django导入-导出用户Foreignkey & M2M导入逻辑检查
EN

Stack Overflow用户
提问于 2020-07-18 20:03:36
回答 1查看 139关注 0票数 0

网络逻辑

  1. 用户创建一个新的Trade对象(输入符号、代理、Notes等数据)。
  2. 贸易仍然是空的
  3. 用户现在为这个行业创建条目(例如。100股@5元买入)
  4. 贸易必须至少有两个整体才能成为封闭的贸易。
  5. 条目添加在与使用inlineformset_factory创建交易相同的窗体页上。

Model.py

代码语言:javascript
复制
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数据(为了更容易地显示数据,我添加了空格而不是",“)

代码语言:javascript
复制
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导入逻辑

为了节省时间,用户只需导入代理提供的交易数据就更好了。这里有一个示例站点 (不是我的项目)也能做到这一点。

代码语言:javascript
复制
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

这逻辑有道理吗?有什么严重的问题我忽略了吗?

任何反馈都非常感谢!

EN

回答 1

Stack Overflow用户

发布于 2020-07-19 11:55:12

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

例如,如果使用after_save_instance(),则可以在上传对象成功持久性之后进行任何逻辑更改。

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

您可能还需要考虑其他一些要点:

  1. 如果用户导入了大量数据,那么您将在and服务器上绑定一个线程,并可能冒超时的风险。对于小型上传来说,这是可以的,但是对于更大的上传,您需要异步运行导入。芹菜也许能帮上忙。
  2. 如果导入过程中途崩溃,会发生什么情况?你能干净地回滚吗?(交易记录在这里会有帮助)。
  3. 如果用户上传同一文件两次,会发生什么情况?他们很可能会这样做,如果他们的联系下降。您的导入过程会避免创建副本吗?想想使过程幂等化所需的逻辑。您可以将自己的逻辑写入跳过重复
  4. 有订单问题吗?文件A需要在文件B之前导入吗?
  5. 这个过程会同时处理多个上传吗?事务和对多个对象的更新可能会导致死锁。

您可能需要考虑一个批处理框架来解决上面的一些问题。换句话说,一旦文件被上传,批处理过程将独立于web服务器处理导入。这显然是更多的工作,但将提供一个更健壮的解决方案。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62973241

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档